因為在標頭檔案中有
#ifndef ***
#define ***..
.#endif
所以在編譯的時候,標頭檔案不會被重複包含,不會出現重定義的問題。
但是如果標頭檔案中有函式的定義,那麼不同cpp檔案都包含這個標頭檔案,在彙編成.o檔案後,不同的.o檔案中都含有標頭檔案中函式的定義,鏈結階段就會出現重定義的問題。
如果出現這種錯誤,找到提示資訊中函式所在的標頭檔案,在標頭檔案中保留函式的宣告,把函式的實現都刪掉,放在乙個單獨的cpp檔案中。
標頭檔案中一定要有函式的宣告,否則編譯器在型別檢查的時候看不見函式的名字。
C 鏈結器弱名稱重複時鏈結的隱患
對於多個cpp中存在相同弱名稱的情況下,g 鏈結的時候是不會提示錯誤的。只有當兩個cpp中都存在強名稱a都時候,鏈結才會出錯。針對第二條,這個規則會引發乙個比較嚴重的隱患。例如 a.cpp include b.cpp int a 10 int b 20 int main b.cpp double a...
c 重複定義
今天測試了一下c 下重複定義會出現什麼問題,使用gcc和vs2010做了測試,兩者的測試結果一樣 一共有5個檔案,2個頭檔案,3個cpp檔案。內容分別如下 ifndef redefine0 h define redefine0 h includeusing namespace std 變數宣告和定義...
在C 中定義全域性變數時避免重複定義
問題 如何在c 中定義全域性變數時避免重複定義呢?今天遇到問題,全域性變數重定義錯誤,印象中記得要加extern,但是怎麼都不對,找資料後得到了解決方案,記之。參考文獻 解決方案 只要在定義時盡量在.cpp檔案中進行,而不要在.h 檔案中定義。定義好了之後,可以在.h檔案中利用extern關鍵字進行...