我有两个 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”)。
提前致谢
/弗里施
尽管我们经常用“文件”来谈论 C 程序的结构,但大多数时候“文件”的真正含义是翻译单元- 一个源文件以及#include其中包含的所有内容。
现在, C 中的变量表示具有内部链接的static变量,即不同翻译单元之间不能通过名称链接的变量。在这种情况下,每个翻译单元都有自己的、完全独立的变量。在这种情况下,拥有多个翻译单元绝对是至关重要的:所讨论的分离只能在不同的翻译单元之间进行。
在您的示例中,您只有一个翻译单元:您将.c文件包含到一个main.c文件中,即将所有翻译单元合并到一个翻译单元中。您的问题的标题是指静态变量“从另一个文件访问”。实际上,您的示例中没有“另一个文件”。您只有一个“文件”。
由于您将所有内容合并到一个翻译单元中,因此您的静态变量声明变成了一个翻译单元内同一变量的重复声明。
请注意,您的静态变量声明恰好同时是定义。在 C++ 中,同一变量的重复定义会触发“多重定义”错误。在 C 中,此类定义被视为暂定定义(特定于 C 的功能),这使得它们可以忽略不计。但是,如果您向静态变量添加显式初始化程序(例如static int buffer = 0;),则定义将不再是暂定的,并且即使在 C 中,代码也将无法编译。
如果您想在这种情况下维护不同的独立变量,请停止将您的.c文件包含到您的main.c文件中。将每个.c文件作为单独的翻译单元独立翻译,然后将它们链接在一起形成最终程序。