C++ : 編程重定義錯誤

C++ 編程重定義錯誤:

 

錯誤1:所編譯的函數實現,已經在目標程序.obj文件中出現。

錯誤原因:包含的頭文件中出現了實現部分的代碼,或者在頭文件尾部包含了對應的.cpp文件。

解決方法:將程序的聲明和定義(實現)嚴格區分開,將聲明存放操.h、.hpp文件中,將實現存放到.cpp文件中。因爲.cpp文件是單獨分開編譯,如果頭文件被多處引用可能導致實現部分被重複包含到不同的.cpp文件中,從而導致多重編譯。

 

錯誤2:某變量多重定義:

錯誤原因:多處被包含的頭文件中存在變量的定義和聲明。此處需要注意,帶有內存分配的變量聲明也可以被理解成定義。

解決方案:

         方案一:在其他.cpp文件需要聲明變量來源,採用extern關鍵字聲明,此關鍵字只是對變量的外部聲明,並不是重新定義變量,因此沒有內存分配,可以理解程序中僅存在一份變量,多處可以調用此變量,因此可以實現內存共享。

         方案二:在頭文件變量名前加上static關鍵字,定義變量爲內部鏈接,這樣每一個包含此頭文件的源文件都含有內部鏈接變量的副本,且相互之間不會影響。這樣就將此變量變成了源文件內部的局部變量。

 

其他注意事項:

         模板類的類函數聲明和實現需要放在同一個頭文件中或者同一個源文件中,但通常放在同一個頭文件中。

         函數默認參數列表從右到左匹配,如果在函數聲明時已經初始化了默認參數列表,在函數定義時則不需要再次填寫默認參數值;或者在定義的時候添加默認參數值,則在聲明時不需要添加默認參數值,推薦在聲明中添加默認值。

         Inline關鍵字是非強制性的,編譯器會根據需要在程序預編譯過程中將函數體代碼添加到引用此函數處。使用原則,程序代碼段較小,程序運行的時間可能比函數調用的時間還短。

         控制程序編譯結構:使用預編譯宏命令,#define 、#if defined 、#ifdef、 #ifdefined()、 #ifndef 、#else 等。建議在文件開通判斷宏定義,爲每段需要控制的代碼取宏名,後面需要做修改則只需修改最開始的宏定義,方便編譯控制。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章