据说有一个程序范围
用静态关键字在全球声明的变量据说具有文件范围。
例如:
int x = 0; // **program scope**
static int y = 0; // **file scope**
static float z = 0.0; // **file scope**
int main()
{
int i; /* block scope */
/* .
.
.
*/
return 0;
}
这两个之间有什么区别?
声明为static
的变量无法从其他文件直接访问。相反,如果在其他文件中声明为extern
,则可以从其他文件访问非static
。
示例:
foo.c
int foodata;
static int foodata_private;
void foo()
{
foodata = 1;
foodata_private = 2;
}
foo.h
void foo();
main.c
#include "foo.h"
#include <stdio.h>
int main()
{
extern int foodata; /* OK */
extern int foodata_private; /* error, won't compile */
foo();
printf("%dn", foodata); /* OK */
return 0;
}
通常,应该避免全局变量。但是,在实际应用中,这些通常很有用。将extern int foo;
声明移至共享标头文件是常见的(示例中的foo.h)。
在C99中,没有什么称为"程序范围"。在您的示例中,变量x
具有一个文件范围,该文件范围在翻译单元末尾终止。变量y
和z
被声明为static
也具有文件范围,但具有内部链接。
c99(6.2.2/3)如果对象的文件范围标识符声明 或一个函数包含存储类规范静态, 标识符具有内部链接
另外,变量x
具有外部链接,这意味着名称x
可以可以访问其他翻译单元或整个程序中。
c99(6.2.2/5)如果对象的标识符声明 文件范围且没有存储类规范符,其链接是外部的。
c程序可以写在几个文件中,这些文件由链接组合到最终执行中。如果您的整个程序都在一个文件中,则没有区别。但是在包括在不同文件中使用函数库的现实世界复杂软件中,差异很大。
只有从其声明点到文件末尾才能看到具有文件范围的变量。文件是指包含源代码的程序文件。大程序中可以有多个程序文件。在所有文件中(不仅在定义的文件中),函数和整个程序中的其他块中都可以看到具有程序范围的变量。有关更多信息。检查以下内容: