未命名的匿名名称空间

可以使用未命名的命名空间来确保名称具有内部链接(只能由当前转换单元引用)。这样的命名空间的定义方式与任何其他命名空间相同,但没有名称:

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