从不同的文件引用静态全局变量
Reference static global variable from a different file
我正在尝试了解静态全局变量。我读到 static
关键字使全局变量“私有”,只能从定义它的文件访问。
为了对此进行测试,我创建了几个文件。
file1.c
:
#include <stdio.h>
#include "file2.c"
extern int a;
extern int b;
int main() {
printf("%d\n", a);
printf("%d\n", 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
变量?
I've read that the static
keyword makes a global variable "private", accessible only from the file it's been defined.
这大致是正确的,但如果您没有意识到“文件”这个词被用作更正确的术语“翻译单元”的更简单的代名词,就会产生误导。后者可以看作是通过(预处理)处理其中的所有 #include
和 conditional-inclusion 指令从源文件形成的复合代码。这形成了编译源代码的一个逻辑单元(标准术语中的“翻译”)。
因此,当谈到将静态声明限定为一个文件时,意思是一个文件打算成为翻译单元的主文件。因此,我们用该文件识别 TU。这实际上是头文件 (.h) 和源文件 (.c) 之间的本质区别——两者都包含 C 源代码,但后者是编译起点,而前者不是。这也是为什么永远不要 #include
.c 文件的原因。
I thought static variables couldn't be accessed from other files. Why
was I able to access a static variable from a different file?
因为您对“文件”的解释与您所指的声明中的含义不同,并且因为您通过 #include
ing 一个 .c 文件违反了支持该词用法的严格约定进入另一个。您只编译了一个翻译单元,所有贡献文件(文件系统意义)的所有 file-scope 声明都在其中可见。
我正在尝试了解静态全局变量。我读到 static
关键字使全局变量“私有”,只能从定义它的文件访问。
为了对此进行测试,我创建了几个文件。
file1.c
:
#include <stdio.h>
#include "file2.c"
extern int a;
extern int b;
int main() {
printf("%d\n", a);
printf("%d\n", 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
变量?
I've read that the
static
keyword makes a global variable "private", accessible only from the file it's been defined.
这大致是正确的,但如果您没有意识到“文件”这个词被用作更正确的术语“翻译单元”的更简单的代名词,就会产生误导。后者可以看作是通过(预处理)处理其中的所有 #include
和 conditional-inclusion 指令从源文件形成的复合代码。这形成了编译源代码的一个逻辑单元(标准术语中的“翻译”)。
因此,当谈到将静态声明限定为一个文件时,意思是一个文件打算成为翻译单元的主文件。因此,我们用该文件识别 TU。这实际上是头文件 (.h) 和源文件 (.c) 之间的本质区别——两者都包含 C 源代码,但后者是编译起点,而前者不是。这也是为什么永远不要 #include
.c 文件的原因。
I thought static variables couldn't be accessed from other files. Why was I able to access a static variable from a different file?
因为您对“文件”的解释与您所指的声明中的含义不同,并且因为您通过 #include
ing 一个 .c 文件违反了支持该词用法的严格约定进入另一个。您只编译了一个翻译单元,所有贡献文件(文件系统意义)的所有 file-scope 声明都在其中可见。