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