【发布时间】:2011-05-10 00:36:49
【问题描述】:
在 C++ 中,将函数或变量放入匿名命名空间会使其内部链接,即。 e.与在文件级别声明 static 相同,但惯用 C++。
普通命名空间中的匿名命名空间呢?它仍然保证内部链接吗?
// foo.cpp
void func1() {
// external linkage
}
static void func2() {
// internal linkage
}
namespace {
void func3() {
// internal linkage
}
}
namespace ns1 {
void func4() {
// external linkage
}
namespace {
void func3() {
// still internal linkage?
}
}
}
【问题讨论】:
-
错误的假设。匿名命名空间内的变量具有外部链接,除非声明为
static。 -
@MSalters:我认为对于 C++11,这已经改变了。
§3.5/4: An unnamed namespace or a namespace declared directly or indirectly within an unnamed namespace has internal linkage. All other namespaces have external linkage. -
@legends2k:这是另一个更改的一部分,它使这些名称作为模板参数有效(在 C++03 中,模板参数需要外部链接,这由匿名命名空间中定义的常量来满足)
标签: c++ namespaces anonymous linkage