C變數重複定義錯誤

2021-06-27 22:57:33 字數 1322 閱讀 1003

c/c++語言中有很多地方要用到extern,但是如果沒有真正的了解它的意義,會給程式設計帶來很大的麻煩,為了使大家少走彎路,特祥細的說明一下。   

對於比較小的程式,一般只有乙個c檔案和乙個標頭檔案,全域性變數我們通常會直接定義在c檔案中,在程式之前加int i定義。如果要在標頭檔案中定義有以下兩種方法:用extern來宣告:extern int i;這一句只是對變數i進行宣告,在c檔案的程式之前必須加上int i進行定義。extern int i=0;這一句宣告和定義都做了。  

對於大一點的程式,有很多c檔案和標頭檔案,這個時候全域性變數就必須在標頭檔案中宣告(不需要初始化),然後在乙個c檔案中定義(該初始化的要初始化)。如果在標頭檔案中定義,則編譯的時候會出現重複定義的錯誤。如果只有標頭檔案中宣告就會出現沒有定義有警告。

*** error l104: multiple public definitions     

symbol: k    

module: 222.obj (222)

出現上述錯誤則是因為變數k重複定義,把你的標頭檔案中的變數定義前加搜尋extern(只是變數宣告不用初始化),再在某乙個你要呼叫該變數的c檔案的程式之前再定義(注意第乙個呼叫的c檔案要負責附帶初始化該變數,其他呼叫的c檔案就不需要初始化過程啦).

但是還有乙個要注意的就是:如果定義的時候加了儲存器型別說明符,那麼引用的時候在extern後也必須加相同的儲存器型別說明符,我就是卡在這裡了。

舉例:對於變數:

原定義:unsigned char abc;

引用:extern abc;

原定義:unsigned char idata abc;

引用:extern idata abc;

原定義:unsigned char xdata abc;

引用:extern xdata abc;

對於陣列

原定義:unsigned char abc[8];

引用:extern abc;

原定義:unsigned char idata abc[8];

引用:extern idata abc;

原定義:unsigned char xdata abc[8];

引用:extern xdata abc;

1)如果兩個或更多c檔案都需要使用某非bit型變數,那麼宣告是應將相應儲存型別同時註明,即如果定義「uchar idata cntembuf;」,那麼應宣告為「extern uchar idata cntembuf;」或者「extern idata cntembuf;」; 

2)如果是bit型變數,則資料型別「bit」必須註明,而儲存型別可以省略;

h檔案裡只能放函式申明和全域性變數,其他的都不要放

C 學習之重複定義的錯誤

原始檔如下 1.cpp void show cout hello world 2.cpp include 1.cpp int main cout main 編譯通過,鏈結錯誤,提示duplicate symbol z6showv 這是因為第二個cpp檔案直接將第乙個cpp檔案包含進來,而不是標頭檔案...

DllMain重複定義的錯誤

今天建立winsole dll工程,從mfc工程中拷貝過來檔案,遇到如下問題 linking.nafxcwd.lib dllmodul.obj error lnk2005 dllmain 12 already defined in libcmtd.lib dllmain.obj nafxcwd.li...

c 重複定義

今天測試了一下c 下重複定義會出現什麼問題,使用gcc和vs2010做了測試,兩者的測試結果一樣 一共有5個檔案,2個頭檔案,3個cpp檔案。內容分別如下 ifndef redefine0 h define redefine0 h includeusing namespace std 變數宣告和定義...