C / C + +全球与静态全球

可能重复:
静态与全局

我对全局和静态全局variables之间的差异感到困惑。 如果静态意味着这个variables是全局唯一的同一个文件,那么为什么在两个不同的文件同名会导致名称冲突?

有人可以解释这个吗?

全局variables(非static )在您创build可用于链接器的.o文件以供在其他文件中使用时存在。 因此,如果你有两个这样的文件,你会得到一个名字冲突:

AC:

 #include <stdio.h> int a; int compute(void); int main() { a = 1; printf("%d %d\n", a, compute()); return 0; } 

公元前:

 int a; int compute(void) { a = 0; return a; } 

因为链接器不知道要使用哪个全局。

但是,当您定义静态全局variables时,您告诉编译器只保留该文件的variables,不要让链接器知道它。 所以,如果你在我写的两个示例代码中添加static (在a的定义中),就不会因为链接器甚至不知道这两个文件中有一个是否存在名称冲突:

AC:

 #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不知道其他文件a情况下自行运行。


作为一个侧面说明,可以将其中一个static ,另一个不要长于不同的文件。 如果两个声明在同一个文件(读取翻译单元 ),一个static和一个extern ,看到这个答案 。

每个文件中的静态名称不应导致名称冲突。 如果你看到了,请发布(简短)演示代码,以及你正在使用的确切编译器,以便我们可以正确地validation代码并假设它是正确的,适当地诋毁编译器。

只是FWIW,C ++中的首选方法是使用匿名命名空间:

 namespace { int not_a_static_variable; } 

坦率地说,不,我不能指出很多的客观优势,但…