C / C ++全局与静态全局

时间:2011-10-20 14:09:03

标签: c++ c static global-variables

  

可能重复:
  Static vs global

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

有人可以解释一下吗?

2 个答案:

答案 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;
}

老实说,不过我不能指出很多客观上的优势......