C/C++全局与静态全局
C/C++ global vs static global
可能重复:
静态与全局
我对全局变量和静态全局变量之间的区别感到困惑。如果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;
}
老实说,不,我不能指出这有多大的客观优势。。。
相关文章:
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 全局静态生存期?他们会让你的程序崩溃吗?
- C++如何使用虚拟基类型声明全局静态分配的变量
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 全局静态变量不"staying defined"函数外部
- 为什么不调用全局静态变量的析构函数
- 全局静态变量阴影
- std::初始值设定项列表全局/静态对象的生存期
- 全局(静态编译的)变量位于哪里
- 可以静态访问全局静态变量的静态函数
- 解决由全局静态变量引起的内存问题
- 全局静态常量字符串不会初始化
- 包含数据的全局静态类
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 我们可以将全局静态变量视为全局变量吗?
- C++-全局静态对象和本地静态对象的构造函数调用不同
- C++从全局静态函数中引用对象
- 全局静态常量shared_ptr被另一个shared_ptr的析构函数奇怪地窃取和删除,为什么?
- 如何查找全局静态初始化
- 离开 c++ 应用程序而不运行全局静态对象的析构函数