1. 程式人生 > >c++ 變數不要定義在.h 標頭檔案當中(main already defined in *.obj 解決方法)

c++ 變數不要定義在.h 標頭檔案當中(main already defined in *.obj 解決方法)

原文地址:http://blog.csdn.NET/tianwailaibin/article/details/6239380

原部落格地址:http://blog.csdn.net/u010536615/article/details/50250747

標頭檔案中定義變數會引起編譯器報錯:main already defined in *.obj 

頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C檔案,這兩個C檔案都include了同一個標頭檔案。而編譯時,這兩個C檔案要一同編譯成一個可執行檔案,於是問題來了,大量的宣告衝突。 

還是把標頭檔案的內容都放在#ifndef和#endif中吧。不管你的標頭檔案會不會被多個檔案引用,你都要加上這個。一般格式是這樣的: 

#ifndef <標識> 
#define <標識> 

...... 
...... 

#endif 

<標識>在理論上來說可以是自由命名的,但每個標頭檔案的這個“標識”都應該是唯一的。標識的命名規則一般是標頭檔案名全大寫,前後加下劃線,並把檔名中的“.”也變成下劃線,如:stdio.h 

#ifndef _STDIO_H_ 
#define _STDIO_H_ 
...... 
#endif 
2.在#ifndef中定義變量出現的問題(一般不定義在#ifndef中)。
#ifndef AAA
#define AAA
...
int i;
...
#endif
裡面有一個變數定義
在vc中連結時就出現了i重複定義的錯誤,而在c中成功編譯。
結論:
(1).當你第一個使用這個頭的.cpp檔案生成.obj的時候,int i 在裡面定義了當另外一個使用這個的.cpp再次[單獨]生成.obj的時候,int i 又被定義然後兩個obj被另外一個.cpp也include 這個頭的,連線在一起,就會出現重複定義.

(2).把源程式副檔名改成.c後,VC按照

C語言的語法對源程式進行編譯,而不是C++。在c語言中,若是遇到多個int i,則自動認為其中一個是定義,其他的是宣告。

(3).C語言和C++語言連線結果不同,可能(猜測)時在進行編譯的時候,C++語言將全域性
變數預設為強符號,所以連接出錯。C語言則依照是否初始化進行強弱的判斷的。(參考)

解決方法:

(1).把源程式副檔名改成.c。

(2).推薦解決方案:
.h中只宣告 extern int i;在.cpp中定義

<x.h>
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__
<x.c>
int i;

注意問題:

變數一般不要定義在.h檔案中。