从不同的文件引用静态全局变量

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?

因为您对“文件”的解释与您所指的声明中的含义不同,并且因为您通过 #includeing 一个 .c 文件违反了支持该词用法的严格约定进入另一个。您只编译了一个翻译单元,所有贡献文件(文件系统意义)的所有 file-scope 声明都在其中可见。