命名空间{ int Foo (int a);}
就像这样。这段代码片段合法吗?
这合法吗?我能在任何地方引用Foo吗?还是只有特定的领域?
谢谢。
发布于 2011-10-06 06:43:15
这是合法的,您可以在同一个中的任何地方使用。
匿名命名空间是对变量使用static的标准规定方式,将其范围限制在相同的翻译单元。
C++03标准节7.3.1.1未命名命名空间
第2段:
在名称空间范围内声明对象时,不推荐使用静态关键字,而未命名的命名空间提供了更好的替代方法。
更新:
正如@Matthieu M.在注释中正确指出的那样, C++11标准从C++03标准中删除了上面的引号,这意味着在命名空间范围中声明对象时static关键字不受欢迎,但是匿名或未命名命名空间仍然有效。
发布于 2011-10-06 06:43:35
这是合法的。您可以在翻译单元中的任何地方引用Foo。
来自C++03-标准,第7.3.1.1节:
(未命名的命名空间定义)的行为就好像它被替换为
命名空间唯一{ /*空体*/ }使用命名空间唯一;命名空间唯一{命名空间-正文}
其中,翻译单元中出现的所有unique被替换为相同的标识符,并且该标识符与整个程序中的所有其他标识符不同。
在名称空间范围内声明对象时,不推荐使用静态关键字;未命名的命名空间提供了更好的替代。。
发布于 2011-10-06 07:39:15
C++11标准中的定义略有改变:
7.3.1.1未命名命名空间namespace.unnamed
1/是一个未命名的命名空间定义,它的行为似乎被替换为
inlineoptnamespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }如果并且只有当内联出现在未命名名称空间定义中时,才会出现
,则转换单元中出现的所有唯一标识符都将被替换为相同的标识符,并且该标识符与整个程序中的所有其他标识符不同。
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示例]
https://stackoverflow.com/questions/7670978
复制相似问题