【发布时间】:2014-02-27 05:10:42
【问题描述】:
我有两个 C 文件,每个文件都定义了一个共享相同名称的静态 int 变量。 我的理解是,在顶层声明的静态变量应该仅限于在同一个文件中使用。 但是,当我运行我的程序时,很明显这些文件会影响彼此的静态变量的值。
我是否误解了 static 关键字的工作原理,还有其他方法可以实现这种基于文件的范围分离吗?
*编辑:添加源代码来演示问题。如 cmets 所示,此代码来自 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”)。
提前致谢
/弗里施
【问题讨论】:
-
您能否提供一小部分代码示例?这些变量是在一个类中声明的吗?
-
变量被限制在文件中,但内存不是。如果您有一个返回此静态变量地址的函数,则另一个文件中的另一个函数可以访问它。本质上,你可以有一个指向这个静态变量的指针。此外,如前所述,您应该举一个小例子。
-
Static variable 的可能重复项
-
欢迎来到 Stack Overflow。请尽快阅读About 页面。如果两个变量在两个单独的源文件中定义
static int i = 0;,则有两个单独的变量。您将需要生成 MCRTE (How to create a Minimal, Complete, Tested and Readable Example),即 MCVE 或 SSCCE (Short, Self-Contained, Correct Example)。显然,您至少需要两个源文件来演示这个问题(但它们会很小)。您还应该确定您正在使用的平台(o/s、版本)和编译器(带有版本)。 -
在顶层声明的静态变量不应仅限于在同一个文件中使用,但它们的可见性仅限于它们所在的同一个文件被声明在其中。这就是为什么你可以在不同的文件中拥有不同的同名静态变量。