c语言 - 引用来自不同文件的静态全局变量



我正在尝试理解静态全局变量。我读过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到另一个文件中违反了支持该单词用法的强约定。 您只编译一个翻译单元,并且所有贡献文件(文件系统感知)的所有文件范围声明都是可见的。

最新更新