未命名的匿名名称空间
可以使用未命名的命名空间来确保名称具有内部链接(只能由当前转换单元引用)。这样的命名空间的定义方式与任何其他命名空间相同,但没有名称:
namespace {
int foo = 42;
}
foo
仅在其出现的翻译单元中可见。
建议永远不要在头文件中使用未命名的命名空间,因为它为包含它的每个转换单元提供了内容的版本。如果定义非 const 全局变量,这一点尤其重要。
// foo.h
namespace {
std::string globalString;
}
// 1.cpp
#include "foo.h" //< Generates unnamed_namespace{1.cpp}::globalString ...
globalString = "Initialize";
// 2.cpp
#include "foo.h" //< Generates unnamed_namespace{2.cpp}::globalString ...
std::cout << globalString; //< Will always print the empty string