namespace {int Foo(int a); }
喜欢这个。这段代码是否合法?
这合法吗?而且,我可以在任何地方引用Foo吗?或只是某个域?
谢谢。
答案 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]