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

时间:2011-11-23 02:50:35

标签: c++ static namespaces

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

namespace { int x; };//  #1

static int x; // #2

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

例如:

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

2 个答案:

答案 0 :(得分:8)

您的大部分问题都已得到解答here.其他问题:

  

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

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

话虽如此,我强烈敦促您编写不关心订单的代码。你依赖于任何全局变量的特定初始化顺序越少越好。

  

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

没有。为了extern某事,您必须能够输入其名称。未命名的命名空间的神奇之处在于无法键入其名称。该名称由编译器分配。你不知道。因此,如果您尝试extern,那么您将改为将其他内容包括在外。

如果在标题中放入未命名的命名空间,则包含它的每个翻译单元都将获得该变量的不同版本。他们都是extern,但他们会谈论不同的外部变量。

答案 1 :(得分:2)

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