#ifndef

#ifndef

這是"if not defined"的簡寫,是宏定義的一種,它是可以根據是否已經定義了一個變數來進行分支選擇,一般用於調試等等。實際上確切的說這應該是預處理功能中三種(宏定義,檔案包含和條件編譯)中的第三種----條件編譯。#ifndef 標識1 //判斷"標識1"是否定義,如果被定義則返回假,如果沒有被定義則返回真。條件指示符#ifndef 的最主要目的是防止頭檔案的重複包含和編譯。這樣一個工程檔案里同時包含兩個test.h時,就不會出現重定義的錯誤了。還是把頭檔案的內容都放在#ifndef和#endif中吧。

定義

#ifndef x //if not define的簡寫

#define x ...#endif

這是宏定義的一種,它可以根據是否已經定義了一個變數來進行分支選擇,一般用於調試等等.實際上確切的說這應該是預處理功能中三種(宏定義,檔案包含和條件編譯)中的一種----條件編譯。 C語言在對程式進行編譯時,會先根據預處理命令進行“預處理”。C語言編譯系統包括預處理,編譯和連結等部分。

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

#define x

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

#endif

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

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

作用

在c語言中,對同一個變數或者函式進行多次聲明是不會報錯的。所以如果h檔案里只是進行了聲明工作,即使不使用# ifndef宏定義,一個c檔案多次包含同一個h檔案也不會報錯。使用#ifndef可以避免下面這種錯誤:如果在h檔案中定義了全局變數,一個c檔案包含同一個h檔案多次,如果不加#ifndef宏定義,會出現變數重複定義的錯誤;如果加了#ifndef,則不會出現這種錯誤。

但是在c++語言中,#ifndef的作用域只是在單個檔案中。所以如果h檔案里定義了全局變數,即使採用#ifndef宏定義,一個c++檔案包含同一個h檔案多次還是會出現全局變數重定義的錯誤。

內容

#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

#define _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 標識符

程式段 I

#else

程式段 2

#endif

它的作用是當 “ 標識符”已經由# d e f i n e定義過了。則編譯“ 程式段 2 ” 。 否則編譯“ 程式段 1 ” 。其中如果不需要編譯“ 程式段 2 ”。則上述形式可以變換 為:

#ifdef 標識符

程式段 1

#endif

形式2

#ifndef 標識符

# define 標識符

程式段 1

#else

程式段 2

#endif

它的作用是當 “ 標識符 沒有由# d e f i n e定義過。 則編譯“程式段 1”。否則編譯“程式段 2” 。同樣當無“ 程式段2 ”時。則上述形式變換為:

# ifndef 標識符

# define 標識符

程式段 1

#endif

形式3

#if 表達式

程式段 1

#else

程式段 2

#endif

它的作用是 當“表達式”值為真時。編譯程式段1。否則則編譯程式段

2。同樣 當無程式段 2時,則上述形式變換 為 :

#if 表達式

程式段 1

#endif

以上三種形式的條件編譯預處理

結構都可以嵌套使用。 當# e l s e後嵌套 # i f 時,可以使用預處理命令 # e l i f , 它相

當於 # e l s e# i f 。在程式中使用條件編譯主要是為了方便程式的調試和移植。

相關詞條

相關搜尋

熱門詞條

聯絡我們