我们可以拥有匿名命名空间(没有名称的命名空间)。它们可直接在同一程序中使用,并用于声明唯一标识符。据说它避免了制作全局静态变量。我的问题是,如果它不是静态的,那么为什么默认值为零?
之前已经提出这些问题,但根本不清楚C++ anonymous namespace: Variables initialized to 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?
}
答案 0 :(得分:4)
匿名命名空间并不能真正阻止名称成为全局名称!实际上,编译器可以创建将符号定义为全局符号的目标文件。但是,匿名命名空间基本上隐藏了这些全局名称,其名称只能从一个翻译单元引用。
零初始化适用于具有静态存储持续时间的所有对象。命名空间级别的所有变量(包括匿名命名空间和函数local static
变量都具有静态存储持续时间,除非它们被声明为thread_local
。
答案 1 :(得分:1)
我认为您错误地理解了短语
据说它避免了制作全局静态变量
或短语本身令人困惑。
在这个短语中,单词static
表示内部联系。例如,如果你要写
namespace N // named namespace
{
static int x;
}
然后变量x将具有内部链接。它将在定义它的编译单元外部不可见。或者包含此定义的每个模块都有一个名为x的单独对象。
要实现相同的效果,可以将其定义放在未命名的命名空间中。在这种情况下,根据C ++ 2011标准,它也将具有内部链接。
namespace // unnamed namespace
{
int x;
}
同时,命名空间中定义的任何对象都具有静态存储持续时间。这意味着它将被初始化。对于基本标量类型,初始化是零初始化。