C++全域性變數的編譯、連結、使用
阿新 • • 發佈:2022-04-12
全域性變數,在.h檔案宣告:
* 1、加extern,別的檔案可以使用,.cpp可以使用,其它包含此標頭檔案的都可以使用。但如果超過2個檔案包含此標頭檔案,會有重複定義的連結錯誤。
-
可以使用 namespace 來解決,匿名namespace相當於編譯為此obj生成了 隨機的作用域名稱,多個檔案包含,也就形成了多個隨機作用域,所以一般不建議使用匿名namespace。
- 2、不加extern,只有.h可以使用,本檔案的.cpp也不可以使用。
-
雖然不可使用,但依舊可以多檔案包含此標頭檔案,但是包含後,就是多作用域,也就是多個隨機作用域名稱。A.cpp包含,就是隨機作用域A,B.cpp包含就是隨機作用域B。操作時,各用個的。
-
多包含,依然可以使用 namespace 來解決重複定義的問題。
全域性變數使用總結:
* 1、正確的使用方式:.h中實名namespace+extern宣告,對應.cpp中帶型別的 變數定義,可初始化,也可不初始化;
-
2、.h中直接宣告,不定義,不加namespace,不加extern,.cpp中直接不認識此變數,編譯錯誤。因為 不加extern宣告,只限制在本檔案可用。
-
3、.h中直接宣告+定義,(有初始化就代表定義),單個檔案包含沒有問題,可以使用。多包含時,重複定義的連結錯誤。
-
4、.h中使用匿名namasapce,隨機作用域,單個檔案包含沒有問題,因為就一個作用域在使用。多檔案包含,會在有多份定義在多個作用域中。使用錯誤,很難查出錯誤。
-
5、.h中使用實名namespace,不使用extern,多個檔案包含,依然有重複定義的連結錯誤;
-
6、.h中,實名namespace,不使用extren,只宣告,不定義,在對應.cpp中定義變數時,會有 編譯錯誤:重定義;
-
7、.h中,實名namespace,使用extren,只宣告,不定義。則連結錯誤:無此變數的定義,也是LNK2001: 無法解析的外部符號。
簡單總結:
多檔案使用變數,請使用實名namespace+extern宣告+定義;