“文件范围”和“程序范围”之间有什么区别
全局声明的变量据说具有程序范围
使用static关键字全局声明的变量据说具有文件范围。
例如:
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; }
这两者有什么区别?
在C99中,没有任何称为“程序范围”的东西。 在您的示例中,变量x
的文件范围终止于翻译单元的末尾。 声明为static
变量y
和z
也具有文件范围但具有内部链接。
C99(6.2.2 / 3)如果对象或函数的文件范围标识符的声明包含静态的存储类说明符,则标识符具有内部链接
此外,变量x
具有外部链接,这意味着名称x
可以被其他翻译单元或整个程序访问。
C99(6.2.2 / 5)如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。
声明为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 int main() { extern int foodata; /* OK */ extern int foodata_private; /* error, won't compile */ foo(); printf("%d\n", foodata); /* OK */ return 0; }
通常,应该避免全局变量。 但是,在实际应用中,这些通常很有用。 移动extern int foo;
是很常见的extern int foo;
声明到共享头文件(示例中为foo.h)。
C程序可以用几个文件编写,这些文件由链接器组合到最终执行中。 如果您的整个程序在一个文件中,那么没有区别。 但在真实世界的复杂软件中,包括在不同文件中使用函数库,差别很大。
具有文件范围的变量仅在其声明点到文件末尾可见。 文件是指包含源代码的程序文件。 大型程序中可以有多个程序文件。 具有程序范围的变量在所有文件中(不仅在定义它的文件中),函数和整个程序中的其他块中可见。 有关详细信息。 检查: C中的范围和存储类 。