無名名稱空間與靜態變數

當你需要在 .cc 檔內放一些不會被其他檔案參考的的定義,請將這些東西放在一個無名名稱空間中,或者將他們全部宣告為 static。 不要在 .h 檔內使用任何這種結構。

定義

無名名稱空間可以對所有宣告給予內部連結性 (Internal Linkage)。 函數與變數則可以透過宣告為 static 來給予內部連結性。 這代表你宣告的東西不能被其他檔案內的東西給存取。 如果其他檔案中宣告了同樣名稱的東西,那麼這兩者會被視為獨立的個體。

我們的決定

我們鼓勵在 .cc 檔中對那些不需要被其他檔案參考的程式碼使用內部連結性,但不要在 .h 檔中使用。

無名名稱空間的格式與一般名稱空間相同。 結尾註解的部分,名稱空間的名稱留白即可:

namespace {
...
} // namespace

譯註

內部連結性 (Internal Linkage) 這個詞不常見,因此稍微解釋一下。 當今天有多個目的檔 (Object Files) 要合併成單一執行檔時,連結器 (Linker) 就會出動,並把這些檔案連結在一起。 具有內部連結性的變數或定義,具有可以在同一專案內被隨處使用,但是在專案外就無法使用的特性。 想要更深入了解可以參考這篇 說明文件(英文)