可以将未命名的命名空间声明为使用全局静态变量声明的优先替代选择。
namespace { declaration-list }
备注
具有上面所示的语法的未命名命名空间定义的行为方式就像它已被以下项替换一样:
namespace unique { declaration-list }
using namespace unique;
每个未命名的命名空间都有一个标识符,它由程序分配和维护,并且在此处由 unique 表示,这与整个程序中的所有其他标识符都不同。 例如:
// unnamed_namespaces.cpp
// C2872 expected
namespace { int i; } // unique::i
void f() { i++; } // unique::i++
namespace A {
namespace {
int i; // A::unique::i
int j; // A::unique::j
}
}
using namespace A;
void h()
{
i++; // C2872: unique::i or A::unique::i
A::i++; // A::unique::i++
j++; // A::unique::j++
}
未命名的命名空间是变量的静态声明的优先替代项。 它们允许变量和函数在整个翻译单元内可见,但在外部不可见。 尽管未命名的命名空间中的实体可能有外部链接,但它们通过其翻译单元特有的名称有效地进行了限定,因此永远不会出现在任何其他翻译单元中。