c語言提供了三種預處理功能:巨集定義,條件包含和條件編譯。顧名思義,預處理就是在進行傳統編譯之前進行一些必要的處理工作。經過預處理的程式就不再包含預處理命令,最後再由編譯程式對預處理後的源程式進行編譯得到目標**。為了與一般的c語言語句區分開來,預處理命令一般用#開頭,而且不用「;」結尾。我現在著重講一下條件編譯的用途,以後有時間才講講巨集定義和條件包含。
譚浩強語:「一般情況下,源程式中所有行都參加編譯。但是有時希望程式中一部分內容只在滿足一定條件時才進行編譯,也就是對這一部分內容指定編譯的條件,這就是『條件編譯』」。其實簡而言之,就是有選擇性地進行編譯。條件編譯主要有以下幾種方式:
(1)#ifdef label
code1;
#else
code2;
#endif
如果label已經被定義,則編譯code1,反之編譯code2。
我們現在再剛剛另外一種變種,就是如果我們沒有定義乙個label的條件編譯形式:(同樣很簡單,只是多了乙個字母n)
#ifndef label
code1;
#else
code2;
#endif
利用這種形式的條件編譯,我們可以避免標頭檔案互相包含的情況。什麼是標頭檔案互相包含呢?就是在較複雜的程式裡,可能會出現乙個標頭檔案中包含另外乙個標頭檔案的情形,如果有乙個原始檔又同時包含了兩者,則等於其中乙個標頭檔案被包含了兩次,這樣就會出現重複定義。如何利用條件編譯解決這個問題呢?很簡單,看:
#ifndef __name_h
#define __name_h
/*不可重複的內容*/
#endif
當__name_h沒有被定義過的話,這就說明這個標頭檔案沒有被包含過,所以我們可以包含這個標頭檔案並且定義__name_h這個變數。當發現那個變數已經被定義過了,我們就知道這個標頭檔案已經被包含過了,於是就不編譯這段標頭檔案。這樣就不會有重複的內容出現了。
(2)接下來的這種條件編譯相當有用,它可以根據不同的事先給定條件執行不同的功能:
#if expression1
code1;
#elif expression2
code2;
#elif expression3
code3;
...#else
code others;
#endif
注意,這裡是elif,不是else if!!!
這種形式跟c語言的if...else語句很像,但是要注意:條件中只能出現常數!!!不可出現變數。
我們可以用這種方式遮蔽一段含有注釋的**,因為/**/不能巢狀。如:
#if 0
int sum(int a, int b)
#endif
這樣就可以有效地測試**了。
條件編譯 if
1 為什麼需要條件編譯 客戶的需求在不停地發生變化,一會兒需要這個功能,一會兒不需要這個功能。我們可以使用條件編譯來方便地裁剪功能。2 條件編譯語句 if 條件編譯語句 if的形式是 1 if expression 2.3 elif expression 4.5 elif expression 6....
if 條件編譯
1.格式 if constant expressionstatements elif constant expressionstatements else statements endif 其中 constant expression 常量表示式 字面值常量,或者乙個有 define定義的符號 由預...
條件編譯 if
1 為什麼需要條件編譯 客戶的需求在不停地發生變化,一會兒需要這個功能,一會兒不需要這個功能。我們可以使用條件編譯來方便地裁剪功能。2 條件編譯語句 if 條件編譯語句 if的形式是 1 if expression 2.3 elif expression 4.5 elif expression 6....