C++命名空间..匿名命名空间是合法的
C++ namespace.... anonymous namespace is legal?
命名空间{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
}
-结束示例]
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- 在命名空间名称之前加上 :: 是什么意思?