關於重複定義 LNK2005

2022-07-01 23:51:14 字數 755 閱讀 5890

有時候會見到同事寫的**中,標頭檔案一開啟就有如下格式:

#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 對於一些初學程式設計的程式設計師,有時...