在静态之上使用未命名的命名空间

Use of Unnamed namespace over static

本文关键字:未命名 命名空间 静态      更新时间:2023-10-16

我是否可以假设在未命名的命名空间中声明的对象等同于static ?

namespace { int x; };//  #1
static int x; // #2

FWIK,在这两种情况下,x将具有静态存储时间和内部链接。
那么,声明为static的对象的所有规则是否适用于未命名命名空间中的对象?

例如:

  • 建设和破坏的顺序是什么?会是一样的吗?
  • 我可以使用extern关键字与x在未命名的命名空间?

你的大部分问题都在这里得到了解答。其余部分:

建设和破坏的顺序是什么?会是一样的吗?

顺序与常规全局变量相同。所以它和静态不一样。

话虽如此,我强烈建议您编写不关心顺序的代码。对于全局变量,越少依赖特定的初始化顺序越好。

我可以在未命名的命名空间中使用extern关键字x吗?

。为了extern的东西,你必须能够键入它的名称。未命名名称空间的神奇之处在于,您不能键入它的名称。该名称由编译器指定。你不知道。因此,如果您尝试extern它,您将代替外部的东西。

如果你在头文件中放置了一个未命名的命名空间,每个包含它的翻译单元都会得到该变量的不同版本。它们都是extern,但它们将讨论一个不同的外部变量

两者都具有内部链接(仅在c++11中未命名命名空间中的链接),但未命名命名空间中的链接不是全局命名空间的成员。例如,你可以在未命名的命名空间和全局命名空间中输入x,它们不会冲突。