C語言之詳解 ifdef等巨集

2021-09-30 03:36:39 字數 2269 閱讀 7747

這幾個巨集是為了進行條件編譯。一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。

條件編譯命令最常見的形式為:

#ifdef 識別符號

程式段1

#else

程式段2

#endif

它的作用是:當識別符號已經被定義過(一般是用#define命令定義),則對程式段1進行編譯,否則編譯程式段2。

其中#else部分也可以沒有,即:

#ifdef

程式段1

#denif

這裡的「程式段」可以是語句組,也可以是命令列。這種條件編譯可以提高c源程式的通用性。如果乙個c源程式在不同計算機系統上系統上執行,而不同的計算機又有一定的差異。例如,我們有乙個資料型別,在windows平台中,應該使用long型別表示,而在其他平台應該使用float表示,這樣往往需要對源程式作必要的修改,這就降低了程式的通用性。可以用以下的條件編譯:

#ifdef windows

#define mytype long

#else

#define mytype float

#endif

如果在windows上編譯程式,則可以在程式的開始加上

#define windows

這樣則編譯下面的命令列:

#define mytype long

如果在這組條件編譯命令之前曾出現以下命令列:

#define windows 0

則預編譯後程式中的mytype都用float代替。這樣,源程式可以不必作任何修改就可以用於不同型別的計算機系統。當然以上介紹的只是一種簡單的情況,可以根據此思路設計出其它的條件編譯。

例如,在除錯程式時,常常希望輸出一些所需的資訊,而在除錯完成後不再輸出這些資訊。可以在源程式中插入以下的條件編譯段:

#ifdef debug

print ("device_open(%p)/n", file);

#endif

如果在它的前面有以下命令列:

#define debug

則在程式執行時輸出file指標的值,以便除錯分析。除錯完成後只需將這個define命令列刪除即可。有人可能覺得不用條件編譯也可達此目的,即在除錯時加一批printf語句,除錯後一一將printf語句刪除去。的確,這是可以的。但是,當除錯時加的printf語句比較多時,修改的工作量是很大的。用條件編譯,則不必一一刪改printf語句,只需刪除前面的一條「#define debug」命令即可,這時所有的用debug作識別符號的條件編譯段都使其中的printf語句不起作用,即起統一控制的作用,如同乙個「開關」一樣。

有時也採用下面的形式:

#ifndef 識別符號

程式段1

#else

程式段2

#endif

只是第一行與第一種形式不同:將「ifdef」改為「ifndef」。它的作用是:若識別符號未被定義則編譯程式段1,否則編譯程式段2。這種形式與第一種形式的作用相反。

以上兩種形式用法差不多,根據需要任選一種,視方便而定。

還有一種形式,就是#if後面的是乙個表示式,而不是乙個簡單的識別符號:

#if 表示式

程式段1

#else

程式段2

#endif

它的作用是:當指定的表示式值為真(非零)時就編譯程式段1,否則編譯程式段2。可以事先給定一定條件,使程式在不同的條件下執行不同的功能。

例如:輸入一行字母字元,根據需要設定條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。

#define letter 1

main()

} 執行結果為:c language

現在先定義letter為1,這樣在預處理條件編譯命令時,由於letter為真(非零),則對第乙個if語句進行編譯,執行時使小寫字母變大寫。如果將程式第一行改為:

#define letter 0

則在預處理時,對第二個if語句進行編譯處理,使大寫字母變成小寫字母(大寫字母與相應的小寫字母的ascii**差32)。此時運**況為:

c language

有人會問:不用條件編譯命令而直接用if語句也能達到要求,用條件編譯命令有什麼好處呢?的確,此問題完全可以不用條件編譯處理,但那樣做目標程式長(因為所有語句都編譯),而採用條件編譯,可以減少被編譯的語句,從而減少目標的長度。當條件編譯段比較多時,目標程式長度可以大大減少。

C語言之詳解 ifdef等巨集

c語言之詳解 ifdef等巨集 這幾個巨集是為了進行條件編譯。一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是 條件編譯 有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。條件編譯命令...

C語言之詳解 ifdef等巨集

c語言之詳解 ifdef等巨集 這幾個巨集是為了進行 條件編譯。一般情況下,源程式中所有的行都參加 編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行 編譯,也就是對一部分內容指定編譯的條件,這就是 條件編譯 有時,希望當滿足某條件時對一組語句進行 編譯,而當條件不滿足時則編譯另一組語句。條件...

C語言之巨集定義

巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括 巨集定義 檔案包含 條件編譯。1.不帶引數的巨集定義 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 字串可以是常數 表示式 格式串等。在編譯預處理時,對...