从另一个文件访问 C 中的静态变量

1 c static scope

我有两个 C 文件,每个文件都定义了一个共享相同名称的静态 int 变量。我的理解是,在顶层声明的静态变量应仅限于在同一文件中使用。然而,当我运行我的程序时,很明显这些文件会影响彼此的静态变量的值。

我是否误解了 static 关键字的工作原理,是否有另一种方法来获得这种基于文件的范围分离?

*编辑:添加源代码来演示问题。如注释所示,此代码来自 3 个独立的文件。

//file 1
static int buffer;
void setter_1(int *input) {
   buffer = *input;
}
void getter_1(int *output) {
   *output = buffer;
}

//file 2
static int buffer;
void setter_2(int *input) {
   buffer = *input;
}
void getter_2(int *output) {
   *output = buffer;
}

//main
#include <stdio.h>

#include "buffer_1.c"
#include "buffer_2.c"

int main() {
    int int1 = 1; 
    int int2 = 2;

    setter_1(&int1);
    setter_2(&int2);

    getter_1(&int1);
    getter_2(&int2);

    printf("%i, %i\n", int1, int2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们期望得到两个不同的数字(“1, 2”),但得到两个相同的数字(“2, 2”)。

提前致谢

/弗里施

AnT*_*AnT 5

尽管我们经常用“文件”来谈论 C 程序的结构,但大多数时候“文件”的真正含义是翻译单元- 一个源文件以及#include其中包含的所有内容。

现在, C 中的变量表示具有内部链接的static变量,即不同翻译单元之间不能通过名称链接的变量。在这种情况下,每个翻译单元都有自己的、完全独立的变量。在这种情况下,拥有多个翻译单元绝对是至关重要的:所讨论的分离只能在不同的翻译单元之间进行。

在您的示例中,您只有一个翻译单元:您将.c文件包含到一个main.c文件中,即将所有翻译单元合并到一个翻译单元中。您的问题的标题是指静态变量“从另一个文件访问”。实际上,您的示例中没有“另一个文件”。您只有一个“文件”。

由于您将所有内容合并到一个翻译单元中,因此您的静态变量声明变成了一个翻译单元内同一变量的重复声明。

请注意,您的静态变量声明恰好同时是定义。在 C++ 中,同一变量的重复定义会触发“多重定义”错误。在 C 中,此类定义被视为暂定定义(特定于 C 的功能),这使得它们可以忽略不计。但是,如果您向静态变量添加显式初始化程序(例如static int buffer = 0;),则定义将不再是暂定的,并且即使在 C 中,代码也将无法编译。

如果您想在这种情况下维护不同的独立变量,请停止将您的.c文件包含到您的main.c文件中。将每个.c文件作为单独的翻译单元独立翻译,然后将它们链接在一起形成最终程序。