我正在尝试理解静态全局变量。我读过static
关键字使全局变量成为"私有",只能从定义的文件中访问。
为了测试这一点,我创建了几个文件。file1.c
:
#include <stdio.h>
#include "file2.c"
extern int a;
extern int b;
int main() {
printf("%dn", a);
printf("%dn", b);
return 0;
}
file2.c
仅包含全局变量定义。一个静态的,另一个不比较:
int a=1;
static int b=2;
编译file1.c
后,输出为:
1
2
由于b
是静态的,我希望它不应该从file1.c
访问。然而,在用extern int b
宣布它之后,file1.c
能够打印出来。
我认为静态变量无法从其他文件访问。为什么我能够从其他文件访问static
变量?
我读到
static
关键字使全局变量"private",只能从定义的文件中访问。
这大致是正确的,但如果您没有意识到"文件"一词被用作更正确的术语"翻译单元"的更简单替代品,则非常具有误导性。 后者可以看作是通过(预)处理其中的所有#include
和条件包含指令从源文件形成的复合代码。 这构成了编译源代码的一个逻辑单元(标准术语中的"翻译")。
因此,当人们谈论静态声明的作用域为一个文件时,一个意味着一个旨在作为翻译单元主文件的文件。因此,我们将 TU 与该文件标识。 这实际上是头文件(.h)和源文件(.c)之间的本质区别——两者都包含C源代码,但后者是编译起点,而前者不是。 这也是为什么永远不应该#include
.c文件的原因。
我认为静态变量无法从其他文件访问。为什么 我是否能够从其他文件访问静态变量?
因为您对"file"的解释与您所指的声明中的含义不同,并且您通过将一个 .c 文件#include
到另一个文件中违反了支持该单词用法的强约定。 您只编译一个翻译单元,并且所有贡献文件(文件系统感知)的所有文件范围声明都是可见的。