舉個例子(範例一):顯然此方式違背了“宣告位於 .h 檔案,定義(實現)位於 .cpp 檔案”的規律。在 C++ 多檔案程式設計中,還有 2 種特殊情況是違背此規律的,分別是類的定義和行內函式的定義,通常情況下它們也都定義在 .h 檔案中。
//demo.h #ifndef _DEMO_H #define _DEMO_H const int num = 10; #endif //main.cpp #include <iostream> #include"demo.h" int main() { std::cout << num << std::endl; return 0; }專案執行結果為:
10
可以看到,使用此方式定義的 const 常數,只需引入其標頭檔案(比如這裡的 demo.h),就可以使用它。注意,將 const 常數定義在 .h 檔案中,為了避免標頭檔案被重複引入,推薦使用 #ifndef/#define/#endif 結構。除此之外,還有 2 中方式可以避免標頭檔案被重複引入,讀者可閱讀《C++防止標頭檔案被重複引入的3種方法》一文做詳細了解。
//demo.h #ifndef _DEMO_H #define _DEMO_H extern const int num; //宣告 const 常數 #endif //demo.cpp #include "demo.h" //一定要引入該標頭檔案 const int num =10; //定義 .h 檔案中宣告的 num 常數 //main.cpp #include <iostream> #include "demo.h" int main() { std::cout << num << std::endl; return 0; }專案執行結果為:
10
前面講過,C++ const 關鍵字會限定變數的可見範圍為當前檔案,即無法在其它檔案中使用該常數。而 extern 關鍵字會 const 限定可見範圍的功能,它可以使 const 常數的可見範圍恢復至整個專案。//demo.cpp extern const int num =10; //main.cpp #include <iostream> extern const int num; int main() { std::cout << num << std::endl; return 0; }專案執行結果為:
10
顯然相比範例二,此專案中省略了 demo.h 標頭檔案的建立,一定程式上提高了專案的編譯效率。本節介紹了 3 種在多檔案程式設計中使用 const 常數的方法,相比後 2 種藉助 extern 修飾 const 常數的方式,第一種方式更簡單、更常用,推薦讀者使用。