代码之家  ›  专栏  ›  技术社区  ›  fabrizzio_gz

从其他文件引用静态全局变量

  •  0
  • fabrizzio_gz  · 技术社区  · 4 年前

    我试图理解静态全局变量。我读过 static 关键字使全局变量“private”,只能从定义它的文件中访问。

    为了测试这一点,我创建了几个文件。 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;
    

    编译后 文件1.c ,输出为:

    1
    2
    

    自从 b 是静态的,我预计它不应该从访问 文件1.c 然而,在宣布之后 extern int b , 文件1.c 能够打印出来。

    我以为静态变量不能从其他文件中访问。为什么我能够访问 静止的 来自不同文件的变量?

    0 回复  |  直到 4 年前
        1
  •  1
  •   John Bollinger    4 年前

    我读过 static 关键字使全局变量“private”,只能从定义它的文件中访问。

    这大致是正确的,但如果你不认识到“文件”这个词被用作更正确的术语“翻译单元”的更简单的替代品,那么它就会产生很大的误导。后者可以被视为通过(预)处理所有 #include 以及其中的条件包含指令。这构成了用于编译的源代码的一个逻辑单元(标准术语中的“翻译”)。

    因此,当人们谈论静态声明的作用域为一个文件时,人们指的是一个旨在成为翻译单元主文件的文件。因此,我们用该文件识别TU。这实际上是头文件(.h)和源文件(.c)之间的本质区别——两者都包含c源代码,但后者是编译起点,而前者不是。这也是为什么一个人永远不应该 #包括 a.c文件。

    我以为静态变量不能从其他文件中访问。为什么? 我能够从其他文件访问静态变量吗?

    因为你对“文件”的解释与你所指的索赔中的含义不同,而且你违反了支持该词使用的严格惯例 #包括 将一个.c文件转换为另一个。您只编译了一个翻译单元,所有贡献文件(文件系统意义)的所有文件范围声明都在其中可见。