C++命名空间..匿名命名空间是合法的

C++ namespace.... anonymous namespace is legal?

本文关键字:命名空间 C++      更新时间:2023-10-16

命名空间{int Foo(int a(;}

就像这样。这个代码片段合法吗?

这合法吗?而且,我可以在任何地方引用Foo吗?还是仅限于某个域?

谢谢。

它是合法的,您可以在同一翻译单元的任何地方使用Foo

匿名名称空间是在变量上表示static的标准规定方式,以将其范围限制在同一个翻译单位。

C++03标准第7.3.1.1节未命名的命名空间

第2段:

在命名空间范围中声明对象时,不赞成使用static关键字,未命名的命名空间提供了一个更好的选择。


更新:
正如@Matthieu M.在评论中正确指出的,以及他的回答C++11标准从C++03标准中删除了上述引用,这意味着在命名空间范围内声明对象时不反对使用static关键字,尽管如此,匿名或未命名的命名空间仍然有效。

这是合法的。您可以在翻译单元内的任何位置引用Foo

来自C++03标准,第7.3.1.1节:

未命名的名称空间定义的行为就像被取代一样

namespace unique { /* empty body */ } using namespace unique;
namespace unique { namespace-body } 

其中unique在翻译单元被相同的标识符替换,并且标识符不同于整个程序中的所有其他标识符。

在中声明对象时,不赞成使用static关键字命名空间范围;未命名的命名空间提供了可供替代的

C++11标准中的定义略有变化:

7.3.1.1未命名的命名空间[namespace.namename]

1/未命名的命名空间定义的行为就像被取代一样

inlineoptnamespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

其中inline出现当且仅当它出现在未命名的命名空间定义中时,翻译单元中所有出现的unique都被相同的标识符替换,并且该标识符与整个程序中的所有其他标识符不同。94[示例:

namespace { int i; } // unique ::i
void f() { i++; } // unique ::i++
namespace A {
  namespace {
    int i; // A:: unique ::i
    int j; // A:: unique ::j
  }
  void g() { i++; } // A:: unique ::i++
}
using namespace A;
void h() {
  i++; // error: unique ::i or A:: unique ::i
  A::i++; // A:: unique ::i
  j++; // A:: unique ::j
}

-结束示例]