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

Vla*_*adp 54 c c++ static global-variables

可能重复:
静态与全局

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

有人可以解释一下吗?

Sha*_*baz 84

static当您创建.o链接器可用于其他文件的文件时,会出现全局变量(非).因此,如果您有两个这样的文件,则会发生名称冲突a:

AC:

#include <stdio.h>

int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

公元前:

int a;

int compute(void)
{
    a = 0;
    return a;
}
Run Code Online (Sandbox Code Playgroud)

因为链接器不知道a要使用哪个全局s.

但是,当您定义静态全局变量时,您告诉编译器仅为该文件保留变量,并且不要让链接器知道它.因此,如果您statica我编写的两个示例代码中添加(在定义中),您将不会仅仅因为链接器甚至不知道其中a任何一个文件中存在名称冲突:

AC:

#include <stdio.h>

static int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

公元前:

static int a;

int compute(void)
{
    a = 0;
    return a;
}
Run Code Online (Sandbox Code Playgroud)

这意味着每个文件都可以在a不知道其他文件的情况下使用它们.


作为旁注,static只要它们位于不同的文件中,就可以使用其中一个而另一个.如果两个声明在同一个文件中(读取翻译单元),一个static和一个extern,请参阅此答案.


Jer*_*fin 8

在每个文件的静态的名称应该不会引起名称冲突.如果您正在看到它,请发布(简短)显示它的演示代码,以及您正在使用的确切编译器,以便我们可以正确验证代码并假设它是正确的,正确地对编译器进行修改.

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

namespace { 
    int not_a_static_variable;
}
Run Code Online (Sandbox Code Playgroud)

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

  • C++ 11删除了静态对象的弃用,所以现在这两种方法都不是特别"首选". (5认同)