一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件
編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。
條件編譯
命令最常見的形式為:
#ifdef 識別符號
程式段1
#else
程式段2
#endif
它的作用是:當識別符號已經被定義過(一般是用#define命令定義),則對程式段1進行編譯,否則編譯程式段2。
其中#else部分也可以沒有,即:
#ifdef
程式段1
#denif
在標頭檔案中使用#ifdef和#ifndef是非常重要的,可以防止雙重定義的錯誤。
如你在標頭檔案aaa.h中定義了乙個類aaa如下:
class aaa
; 如果兩次#include "aaa.h"(不見得是直接,也有可能兩個不同的標頭檔案中都包含了這個標頭檔案)就會出錯,因為相同的類不能定義兩次。把aaa.h稍做修改:
#ifndef _aaa_
#define _aaa_
class aaa
; #endif
就可以避免這樣的問題。因為當你已經包含過這個檔案,_aaa_就會有了定義,那麼#ifndef的條件為假,就不會再執行後面的類定義了。
#ifdef和#endif必須成對使用。
從理論上講可以出現在任何地方(標頭檔案和實現檔案中)
通常為了防止標頭檔案被多次包含,在標頭檔案中使用是必須的:
如:#ifndef my_head_h //標頭檔案開頭,名字是任意的,注意不要和其它標頭檔案衝突
標頭檔案宣告
#endif //標頭檔案結尾
有時候,在b.h中會include "a.h" ,在"c.h"中會include "b.h"及include"a.h", 這時,如果不用ifndef/endif,就會包含兩次a.h,產生錯誤。
還是把頭檔案的內容都放在#ifndef和#endif中吧。不管你的標頭檔案會不會被多個檔案引用,你都要加上這個。一般格式是這樣的:
#ifndef 《標識》
#define 《標識》
......
......
#endif
《標識》在理論上來說可以是自由命名的,但每個標頭檔案的這個「標識」都應該是唯一的。標識的命名規則一般是頭檔名全大寫,前後加下劃線,並把檔名中的「.」也變成下劃線,如:stdio.h
#ifndef _stdio_h_
#define _stdio_h_
......
#endif
ifdef與 endif的作用
ifndef list h define list h class list else endif 常用於標頭檔案中,防止.件中類被重複定義,因為在乙個標頭檔案a中常常引用另乙個標頭檔案b,在主程式中如果引用a.h,b.h,那麼b中的類會出現重複定義的情況,則會報錯。很多時候我們並不清楚標頭檔案之間...
ifdef與 endif的作用及用法
ifdef與 endif的作用及用法 andylanzhiyong的部落格 csdn部落格 一般情況下,源程式所有的行都參與編譯。但是有時希望對其中一部分內容只有滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是 條件編譯 有時 希望當滿足條件時對一組語句進行編譯,當條件不滿足時則編譯...
條件 ifdefine與 endif的作用
好久沒寫 基本的東西都忘了。今天工作中犯了這個小錯誤,記下來,順便溫習一下。條件編譯中最常見的一種就是如下這種情況 ifdef 識別符號 程式段1 else 程式段2 endif 意思是,如果定義了識別符號就執行程式段1,否則就執行程式段2。其中的else可有可無,看自己 邏輯情況而定。稍微再引申一...