最近工作時,遇到了這個錯誤,我在乙個標頭檔案bkdrhash.h中定義了一函式
#ifndef _____h
#define ----h
size_t bkdrhash(char * pch)
#endif
當我第一次使用這個函式時候,直接用#include」bkdrhash.h「,沒出現錯誤。當我又在同乙個工程的另乙個cpp檔案中使用時,編譯階段出現了error lnk 1169,找到乙個或多個重定義的符號,當時我就懵了,不是加了#ifndef-#endif了嗎,怎麼還是出這樣的錯誤呢?
上網查了一番資料後,我把函式的定和義實現分開,分別放在標頭檔案裡和cpp檔案裡。
#ifndef _____h
#define -----h
size_t bkdrhash(char * pch);
#endif
#define
"rkdrhash.h"
size_t bkdrhash(char * pch)
為什麼會出現多次重定義的錯誤,原因在於原來直接在標頭檔案(.h)裡定義了函式,其他檔案在include時,直接把該函式的實現插入了該檔案中,只引用一次還好,如果超過1次,則會把同乙份**拷貝到多個檔案中,這樣就出現了多個同名的函式,當然這!就!是!多重定義了!!!。編譯時能通過,因為沒有語法錯誤,然而鏈結時就會出錯。
為什麼#ifnde – #endif沒起作用,原因在於這組命令只會使得該標頭檔案不會被同乙個檔案包含多次,從而防止出現以上多重定義的錯誤,然而把函式定義在標頭檔案中,而不同的檔案裡引用該函式定義的標頭檔案時,就一定會出現lnk 1169錯誤,原因就在於第1條解釋的那樣,而宣告放在標頭檔案裡,其他檔案引用時,只是得到僅有的乙個函式宣告,而不是乙個函式定義。
看似乙個很尋常的錯誤,我不僅走運地解決了問題,而且還分析出了錯誤出現的原因。原來讀書沒體會到的函式的宣告,定義分開的作用竟然還有這樣的原因,而一直認為只是出於保密的需要,不給其他人看具體實現才分開的。以後我會謹遵這個教訓,堅決把定義和實現分離!
犯了多次的error LNK2019 錯誤
在專案裡面建立類的時候,在實現那裡沒有忘記了類名 這種應該是c語言帶過來的錯誤!原因一 只是在.h裡面宣告了某個方法,沒有在cpp裡面實現 具體講,有時候在標頭檔案中宣告了需要的方法,確實忘記了在原始檔中實現 有時候在標頭檔案中宣告了需要的方法,在原始檔中實現了該方法,但是卻遺留了方法名前的 cla...
error LNK2005編譯錯誤 EVC
error lnk2005錯誤有很多種,有些跟.h標頭檔案引用順序有關,有些與lib庫的引用順序有關,難以捉摸。最近在做fbreader移植到wince系統就遇到了這兩種情況,故而記之。問題現象一 重複定義,錯誤提示如下 標頭檔案順序 include zlfile.h include zlzdeco...
error LNK1123」 錯誤,終極解決方案
終極解決方案 vs2010在經歷一些更新後,建立win32 console project時會出 error lnk1123 錯誤,解決方案為將 專案 專案屬性 配置屬性 清單工具 輸入和輸出 嵌入清單 是 改為 否 即可,但是沒新建乙個專案都要這樣設定一次。在建立vs2010 win32 proj...