編譯器預處理 ifndef 條件編譯

2021-06-26 06:54:55 字數 2708 閱讀 2747

這是 //if not defined的簡寫是巨集定義的一種,它是可以根據是否已經定義了乙個變數來進行分支選擇,一般用於除錯等等。實際上確切的說這應該是預處理功能中三種(巨集定義,檔案包含和條件編譯)中的一種----條件編譯。

#define x //定義乙個巨集

...

#endif

//c語言在對程式進行編譯時,會先根據預處理命令進行「預處理」。c語言編譯系統包括預處理,編譯和鏈結等部分。

#ifndef x//先測試x是否被巨集定義過

#define x

程式段1 //如果x沒有被巨集定義過,定義x,並編譯程式段 1

#else

程式段2 //如果x已經定義過了則編譯程式段2的語句,「忽視」程式段 1。

#endif//終止if

條件指示符#ifndef 的最主要目的是防止標頭檔案的重複包含和編譯。了解:條件編譯當然也可以用條件語句來實現。 但是用條件語句將會對整個源程式進行編譯,生成的目標**程式很長,而採用條件編譯,則根據條件只編譯其中的程式段1或程式段2,生成的目標程式較短。如果條件選擇的程式段很長,採用條件編譯的方法是十分必要

#ifndef 標識1 //判斷"標識1"是否定義,如果被定義則返回假,如果沒有被定義則返回真。

/**********************************/

語句1 #ifndef 標識1

語句2 #define 標識1

語句3 #endif

語句4 ……

語句5 ……

該段**意思是:如果標識1沒有被定義,則重定義標識1,即執行語句2、語句3;如果標識1已經被定義,則直接跳過語句2、語句3,直接執行語句4、語句5、……

/***********************************/

備註:#ifndef 和 #endif 要一起使用,如果丟失#endif,可能會報錯。

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

例如要編寫標頭檔案test.h

在標頭檔案開頭寫上兩行:

#ifndef _test_h

#endif

這樣乙個工程檔案裡同時包含兩個test.h時,就不會出現重定義的錯誤了。

分析:當第一次包含test.h時,由於沒有定義_test_h,條件為真,這樣就會包含(執行)#ifndef _test_h和

#endif之間的**,當第二次包含test.h時前面一次已經定義了_test_h,條件為假,#ifndef _test_h和

#endif之間的**也就不會再次被包含,這樣就避免了重定義了.

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

#ifndef 《標識》

#define 《標識》

......

......

#endif

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

#ifndef _stdio_h

#define _stdio_h

......

#endif

「 條件編譯」命令允許對程式中的內容選擇性地編譯,即可以根據一定的條件選擇是否編譯。

條件編譯的命令主要有以下幾種 :

形式1

#ifndef 識別符號

程式段 1

#else

程式段 2

#endif

它的作用是當 「 識別符號」沒有由# define定義過了。則編譯「 程式段 1 」 。 否則編譯「 程式段 2 」 。其中如果不需要編譯「 程式段 2 」。則上述形式可以變換 為:

#ifndef 識別符號

程式段 1

#endif

形式2

#ifndef 識別符號

# define 識別符號

程式段 1

#else

程式段 2

#endif

它的作用是當 「 識別符號 沒有由# define定義過。 則編譯「程式段 1」。否則編譯「程式段 2」 。同樣當無「 程式段2 」時。(作用與形式1完全相同)則上述形式變換為:

# ifndef 識別符號

# define 識別符號

程式段 1

#endif

形式3

#if 表示式

程式段 1

#else

程式段 2

#endif

它的作用是 當「表示式」值為真時。編譯程式段1。否則則編譯程式段2。同樣 當無程式段 2時,則上述形式變換為 :

#if 表示式

程式段 1

#endif

以上三種形式的條件編譯預處理結構都可以巢狀使用。 當#else後巢狀 #if 時,可以使用預處理命令 # elif , 它相當於 #else#if。在程式中使用條件編譯主要是為了方便程式的除錯和移植。

編譯器預處理實現

我們寫 一般都會寫一些注釋,為了讓人更好的理解 但是對於編譯器來說,這些注釋都需要去除,為了實現預處理,就是去除注釋 換行 回車等,我用dfa 確定有限自動機 來實現。include include using namespace std define r 10 define c 8 dfa int...

預處理 條件編譯

假如現在要開發乙個c語言程式,讓它輸出紅色的文字,並且要求跨平台,在 windows 和 linux 下都能執行,怎麼辦呢?這個程式的難點在於,不同平台下控制文字顏色的 不一樣,我們必須要能夠識別出不同的平台。windows 有專有的巨集 win32,linux 有專有的巨集 linux 以現有的知...

預處理 條件編譯

條件編譯 預處理程式提供了條件編譯的功能。可以按不同的條件去編譯不同的程式部分,因而產生不同的目標 檔案。這對於程式的移植和除錯是很有用的。條件編譯有三種形式 ifdef ifndef if 1 ifdef ifdef 識別符號 程式段1 else 程式段2 endif 或者 ifdef 識別符號 ...