有時候會見到同事寫的**中,標頭檔案一開啟就有如下格式:
#ifndef ...
#define ...
...//正文
#endif
當時看不出有什麼意義,於是也就不明白為什麼這麼寫了,就這樣讓它做為乙個高階的存在放在記憶裡
今天它從神壇上掉了下來:
原來它是意義僅僅是替換 #pragma once,然而標頭檔案中都包含此句 -_-」 omg
這樣可以避免標頭檔案被重複包含,並被重複編譯,於是也可以避免標頭檔案中可能存在的全域性變數被重複定義。
以下幾種情形與全域性變數重複定義有關:
1.因為全域性變數是針對整個工程的,正確的:在乙個cpp檔案中定義,eg. int g_test;在另乙個要使用的cpp中宣告:extern int g_test。
但是如果還是 int g_test就會lnk2005了。
劃重點,c++標準的規定,變數是宣告必須滿足以下兩個條件,否則就是定義:
(1)宣告必須使用extern關鍵字;
(2)不能給變數賦初值;
所以int a; int a = 0; extern int a =0; 是定義
extern int a; 是宣告
2.當頭檔案中宣告了全域性變數時,必段使用#pragma once 來避免重複定義,也可以使用上邊提到的巨集定議方式
3.當使用第三方庫出現重定義時,例如mfc庫與c執行庫,以及mfc與atl庫等。當出現重複定義時,可以將提示出錯的庫放在另乙個庫前邊。可以的話不只使用其中乙個庫。
LNK2005符號重定義問題
最近修改乙個服務模組的時候,發現編譯的時候竟然出現lnk2005錯誤 1 libcmt.lib invarg.obj error lnk2005 void cdecl invalid parameter unsigned short const unsigned short const unsign...
使用hiredis報錯LNK2005
專案的db中使用了redis python mysql的儲存方案,在編譯redis庫的時候,win32 interop.lib與專案中原有的net.lib有編譯衝突,net.lib引用了ws2 32.lib,導致tcp的幾個介面bind accept 報重複定義的錯誤。解決方案 修改了redis的原...
VC 的鏈結錯誤LNK2005
vc 的鏈結錯誤lnk2005 程式設計中經常能遇到lnk2005錯誤 重複定義錯誤,其實lnk2005錯誤並不是乙個很難解決的錯誤。弄清楚它形成的原因,就可以輕鬆解決它了。造成lnk2005錯誤主要有以下幾種情況 1 重複定義全域性變數。可能存在兩種情況 a 對於一些初學程式設計的程式設計師,有時...