前言
總看到一些地方說定義語句別放在標頭檔案中,因為會引起重定義。但具體程式設計中,卻發現有些定義又不得不放在標頭檔案中。
這可如何是好?基於對這個問題的思考,有了這篇隨筆。
重定義產生的情況
情況一:多個原始檔包含了同一個標頭檔案時,如果標頭檔案中有某個區域性變數或者非行內函數的定義,那麼相當於每個原始檔都把該區域性變數或者非行內函數定義了一次。而它們(區域性變數或者非行內函數)在這種情況下預設又是全域性的,那麼自然會導致重定義錯誤。
情況二:某個原始檔多次包含同一個標頭檔案時,如果標頭檔案中有定義語句,那麼不管是什麼東西的定義,都會產生重定義錯誤。
解決方法
針對情況一:我們應當避免在標頭檔案中定義區域性變數或者非行內函數。而由於編譯器會將類,行內函數以及const變數預設視為定義它們的原始檔所私有,因此它們(類,行內函數以及const變數)可以定義在標頭檔案中。
針對情況二:我們可以在標頭檔案中使用一種叫做標頭檔案保護符的東西,格式如下:
1 #ifndef A_H 2 #define A_H 3 4 /* 這裡寫真正的標頭檔案 */ 5 6 #endif
這樣就能保證標頭檔案不會被某個原始檔重複包含。不但避免了一種重定義的情況,還能使得程式的效率提高,何樂而不用呢?
總結
只要我們的程式碼做到上述“解決方法”中的那兩點,標頭檔案的重定義問題就基本解決了。