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