匿名命名空间如何避免使全局静态变量?

我们可以有匿名命名空间(没有名字的命名空间)。 它们可以在同一个程序中直接使用,并用于声明唯一标识符。 据说它避免了使全局静态变量。我的问题是,如果它不是静态的,那么为什么默认值为零?

由于这些问题之前已经被问到过,但在所有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变量)都具有静态存储持续时间。

链接地址: http://www.djcxy.com/p/35325.html

上一篇: How anonymous namespaces avoids making global static variable?

下一篇: Static global variables in C++