可能重复:
Static vs global
我对全局变量和静态全局变量之间的差异感到困惑。如果静态意味着此变量仅对同一文件是全局的,那么为什么在两个不同的文件中同名会导致名称冲突?
有人可以解释一下吗?
答案 0 :(得分:80)
当您创建链接器可用于其他文件的static
文件时,全局变量(不是.o
)就在那里。因此,如果您有两个这样的文件,则会在a
上发生名称冲突:
交流转换器:
#include <stdio.h>
int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
b.c:
int a;
int compute(void)
{
a = 0;
return a;
}
因为链接器不知道要使用哪个全局a
。
但是,当您定义静态全局变量时,您告诉编译器仅为该文件保留变量,并且不要让链接器知道它。因此,如果将static
(在a
的定义中)添加到我编写的两个示例代码中,您将不会因为链接器甚至不知道存在{{1}而得到名称冲突在任一文件中:
交流转换器:
a
b.c:
#include <stdio.h>
static int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
这意味着每个文件都使用自己的static int a;
int compute(void)
{
a = 0;
return a;
}
而不知道其他文件。
作为旁注,可以让其中一个a
和另一个没有,只要它们在不同的文件中即可。如果两个声明在同一个文件中(读取翻译单元),一个static
和一个static
,请参阅this answer。
答案 1 :(得分:8)
每个文件中的静态名称不会导致名称冲突。如果您正在看到它,请发布(简短)显示它的演示代码,以及您正在使用的确切编译器,以便我们可以正确验证代码并假设它是正确的,正确地诋毁编译器。
只是FWIW,C ++中首选的方法是使用匿名命名空间:
namespace {
int not_a_static_variable;
}
老实说,不过我不能指出很多客观上的优势......