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

C/C++ global vs static global

本文关键字:全局 静态 C++      更新时间:2023-10-16

可能重复:
静态与全局

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

有人能解释一下吗?

当您创建链接器可用于其他文件的.o文件时,全局变量(而不是static(就在那里。因此,如果你有两个这样的文件,你会在a:上发生名称冲突

a.c:

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

b.c:

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

因为链接器不知道要使用全局CCD_ 4中的哪一个。

然而,当你定义静态全局变量时,你告诉编译器只为该文件保留变量,不要让链接器知道它。因此,如果你在我写的两个示例代码中添加static(在a的定义中(,你就不会因为链接器甚至不知道两个文件中都有a而发生名称冲突:

a.c:

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

b.c:

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

这意味着每个文件都使用自己的a,而不知道其他文件。


顺便说一句,只要它们在不同的文件中,就可以将其中一个static和另一个放在一起。如果两个声明在同一个文件中(读取翻译单元(,一个是static,一个extern,请参阅此答案。

每个文件中的静态名称不应导致名称冲突。如果你看到了这一点,请发布(简短的(演示代码,并附上你正在使用的确切编译器,这样我们就可以正确地验证代码,并假设它是正确的,正确地诋毁编译器。

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

namespace { 
    int not_a_static_variable;
}

老实说,不,我不能指出这有多大的客观优势。。。