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

How anonymous namespaces avoids making global static variable?

本文关键字:全局 静态 变量 何避免 命名空间      更新时间:2023-10-16

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

由于这些问题已经问过了,但它是不清楚在所有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;
}

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