匿名命名空间如何避免使全局静态变量
How anonymous namespaces avoids making global static variable?
可以使用匿名命名空间(没有名称的命名空间)。它们可以在同一个程序中直接使用,并用于声明唯一标识符。据说它避免了全局静态变量。我的问题是,如果它不是静态的,那么为什么默认值是零?
由于这些问题已经问过了,但它是不清楚在所有c++匿名命名空间:变量初始化为0?
#include<iostream>
using namespace std;
namespace
{
int x; // Here x should have garbage value according to definition of anonymous namespace
}
int main()
{
cout << x << endl;// But x is throwing zero why?
}
匿名命名空间并不能真正阻止名称成为全局名称!事实上,编译器可以创建将符号定义为全局符号的目标文件。然而,匿名命名空间基本上隐藏了这些全局名称,并使用一个只能从一个翻译单元引用的名称。
零初始化适用于所有具有静态存储时间的对象。命名空间级别的所有变量,包括匿名命名空间和函数本地static
变量,除非声明为thread_local
,否则具有静态存储持续时间。
我认为你错误地理解了这个短语
据说它避免了全局静态变量
或者短语本身令人困惑。
在这个短语中,单词static
表示内部链接。例如,如果你写
namespace N // named namespace
{
static int x;
}
则变量x将具有内部链接。它在定义它的编译单元之外是不可见的。或者每个包含此定义的模块都有一个单独的对象,名称为x。
要达到相同的效果,您可以将其定义放在未命名的名称空间中。在这种情况下,根据c++ 2011标准,它也将具有内部链接。
namespace // unnamed namespace
{
int x;
}
同时,命名空间中定义的任何对象都具有静态存储持续时间。这意味着它将被初始化。对于基本标量类型,初始化为零初始化。
相关文章:
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 全局静态生存期?他们会让你的程序崩溃吗?
- C++如何使用虚拟基类型声明全局静态分配的变量
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 全局静态变量不"staying defined"函数外部
- 为什么不调用全局静态变量的析构函数
- 全局静态变量阴影
- std::初始值设定项列表全局/静态对象的生存期
- 全局(静态编译的)变量位于哪里
- 可以静态访问全局静态变量的静态函数
- 解决由全局静态变量引起的内存问题
- 全局静态常量字符串不会初始化
- 包含数据的全局静态类
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 我们可以将全局静态变量视为全局变量吗?
- C++-全局静态对象和本地静态对象的构造函数调用不同
- C++从全局静态函数中引用对象
- 全局静态常量shared_ptr被另一个shared_ptr的析构函数奇怪地窃取和删除,为什么?
- 如何查找全局静态初始化
- 离开 c++ 应用程序而不运行全局静态对象的析构函数