# ifdef #ifndef 等用法(轉)

頭件的中的#ifndef,這是一個很關鍵的東西。好比你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,因而問題來了,大量的聲明衝突。io

仍是把頭文件的內容都放在#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;

注意問題:

(1).變量通常不要定義在.h文件中。

相關文章
相關標籤/搜索