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

时间:2014-06-21 14:10:35

标签: c++ namespaces

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

之前已经提出这些问题,但根本不清楚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?
}

2 个答案:

答案 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;
}

同时,命名空间中定义的任何对象都具有静态存储持续时间。这意味着它将被初始化。对于基本标量类型,初始化是零初始化。