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

标签 c static scope

我有两个 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"的真正含义是翻译单元 - 一个包含所有内容的源文件这是 #included 到里面。

现在,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/

相关文章:

c - 在 C 中将字符串的第一个字符读取为整数

c - 为什么我无法让 System V 消息队列与 fork() 一起使用?

c - 删除字符串中所有出现的子字符串

unity-game-engine - Unity保存foreach?

Angular2-与 Observable Catch 闭包范围混淆

c++ - 模板实例化期间第二遍名称查找的静态命名空间与匿名命名空间的差异

c - 读取.txt文件并打印结果

ios - 在 iOS/iPhone SDK 中控制第三方符号的导出

java - Android:适配器内的静态变量为空

C++ - 在类定义结束时创建的对象的范围