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