全局声明的变量是具有程序范围,所述
用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
具有终止于翻译单元的端部的文件的范围。 变量y
和z
所宣static
也有文件范围,但具有内部链接。
C99(6.2.2 / 3)如果对象或功能的文件范围标识符的声明包含存储类说明静态的,标识符具有内部连接
另外,变量x
具有外部连接,这意味着名称x
可以是其它的转换单元或整个程序访问。
C99(6.2.2 / 5)如果一个对象的标识符的声明有文件范围和没有存储类说明,其连接是外部的。
声明为变量static
,不能直接从其他文件访问。 与此相反,非static
的人可以从其他的文件,如果声明为访问extern
这些其他文件。
例:
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("%d\n", foodata); /* OK */
return 0;
}
一般情况下,应避免全局变量。 然而,在实际应用中那些往往是有用的。 这是常见的移动extern int foo;
声明到共享头文件(foo.h中中的例子)。
C程序可以写在几个文件中,这是通过连接组合成最终的执行。 如果你的整个程序是在一个文件中,则没有什么区别。 但在现实世界中复杂的软件,其中包括使用在不同的文件中的函数库,所不同的是显著。
与文件范围的变量进行了声明点到文件的末尾才可见。 的文件指的是包含源代码的程序文件。 可以有一个大的程序中多个程序文件。 用程序作用域变量是所有文件内(不仅在其所定义的文件)在整个程序,函数和其他块可见的。 如需进一步信息。 检查: 用C范围和存储类型 。