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

时间:2011-10-06 06:39:12

标签: c++ namespaces

  

namespace {int Foo(int a); }

喜欢这个。这段代码是否合法?

这合法吗?而且,我可以在任何地方引用Foo吗?或只是某个域?

谢谢。

3 个答案:

答案 0 :(得分:9)

这是合法的,您可以在同一 Translation Unit 的任何地方使用Foo

匿名命名空间是对变量说static以将其范围限制在同一翻译单元的标准规定方式。

C ++ 03标准部分7.3.1.1未命名的命名空间

第2段:

  

在声明命名空间作用域中的对象时,不推荐使用static关键字,unnamed-namespace提供了一个更好的选择。


<强>更新
正如@Matthieu M.正确地在评论中指出的那样,并且 his answer C ++ 11标准从C ++ 03 Standard中删除了上述引用,这意味着{{1}在声明命名空间范围内的对象时,不会弃用}关键字,但匿名或未命名的命名空间仍然有效。

答案 1 :(得分:5)

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

从C ++ 03标准,第7.3.1.1节:

  

unnamed-namespace-definition的行为就像它被

替换一样
namespace unique { /* empty body */ } using namespace unique;
namespace unique { namespace-body } 
     

其中出现unique的所有内容   翻译单元由相同的标识符替换   标识符与整个程序中的所有其他标识符不同。

     

在声明对象时,不推荐使用static关键字   命名空间范围; unnamed-namespace提供了一个优越的   替代品。

答案 2 :(得分:3)

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

  

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

     

1 / 未命名的命名空间定义的行为就像被

替换一样
inlineoptnamespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }
  

其中inline出现,当且仅当它出现在unnamed-namespace-definition中时,翻译单元中所有出现的unique都被相同的标识符替换,并且此标识符与整个program中的所有其他标识符不同。 em> [例如:

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
}
  

-end example]