匿名命名空间如何避免使全局静态变量?
我们可以有匿名命名空间(没有名字的命名空间)。 它们可以在同一个程序中直接使用,并用于声明唯一标识符。 据说它避免了使全局静态变量。我的问题是,如果它不是静态的,那么为什么默认值为零?
由于这些问题之前已经被问到过,但在所有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
意味着内部联系。 例如,如果你会写
namespace N // named namespace
{
static int x;
}
那么变量x就会有内部联系。 在定义它的编译单元之外它将不可见。 或者每个包含这个定义的模块都会有一个名为x的独立对象。
为了达到相同的效果,您可以将其定义放在一个未命名的名称空间中。 在这种情况下,根据C ++ 2011标准,它也将具有内部链接。
namespace // unnamed namespace
{
int x;
}
同时,在命名空间中定义的任何对象都具有静态存储持续时间。 这意味着它将被初始化。 对于基本标量类型,初始化是零初始化。
匿名命名空间并不能真正阻止名称成为全局名称! 事实上,编译器可能会创建将这些符号定义为全局符号的对象文件。 但是,匿名名称空间基本上隐藏了这些全局名称,只能从一个翻译单元引用该名称。
零初始化适用于具有静态存储持续时间的所有对象。 除非声明了thread_local
否则名称空间级别的所有变量(包括匿名名称空间和函数本地static
变量)都具有静态存储持续时间。
上一篇: How anonymous namespaces avoids making global static variable?