未命名的匿名名稱空間

可以使用未命名的名稱空間來確保名稱具有內部連結(只能由當前轉換單元引用)。這樣的名稱空間的定義方式與任何其他名稱空間相同,但沒有名稱:

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