C/C++ 以「一次定義、多次宣告」為基本原則。定義分配記憶體,宣告提供名稱引用。圍繞定義有四大屬性:生存期、作用域、潛在作用域、鏈接屬性。搞混這些概念是重複定義錯誤的主要根源。
static 變數。存活於整個程式執行期間。new/malloc 分配的堆記憶體。需手動釋放,否則洩漏。| 鏈接類型 | 關鍵字/預設 | 潛在作用域 | 可被其他編譯單元使用 |
|---|---|---|---|
| 外部鏈接 | 無 / extern | 全程式 | 是 |
| 內部鏈接 | static / 無名命名空間 | 單一編譯單元 | 否 |
| 無鏈接 | 區域變數 / 函式參數 | 所在程式碼區塊 | 否 |
遮蔽規則:區域遮蔽內部,內部遮蔽外部。同潛在作用域內無遮蔽的同名宣告會導致重複定義錯誤。
static 或置於 namespace { } 中,將外部鏈接轉為內部鏈接。ns::name 限定,避免全域命名污染。const 全域變數預設為內部鏈接(C++ 特有,C 語言為外部)。const 全域變數預設為外部鏈接。專案中建立命名規範:模組內部實現檔(.cpp)盡量使用無名命名空間封裝輔助函式/變數;公開介面才放入具名命名空間並配合 extern 於標頭檔宣告。此法能從源頭消除 90% 的鏈接衝突與潛在作用域混淆問題。