ifdef endif的作用及其使用技巧

2021-09-09 08:00:45 字數 4193 閱讀 9704

原文:

電腦程式語句,我們可以用它區隔一些與特定標頭檔案、程式庫和其他檔案版本有關的**。

#ifdef語句1

//程式2

#endif

可翻譯為:如果巨集定義了語句1則程式2。

作用:我們可以用它區隔一些與特定標頭檔案、程式庫和其他檔案版本有關的**。

**舉例:新建define.cpp檔案

#include

usingnamespacestd;

intmain(intargc,char*ar**)

執行結果為:

pressanykeytocontinue

改寫**如下:

#include

usingnamespacestd;

#definedebug

intmain(intargc,char*ar**)

執行結果為:

beginningexecutionofmain()

pressanykeytocontinue

更一般的情況是,#define語句是包含在乙個特定的標頭檔案中。比如,新建標頭檔案head.h,在檔案中加入**:

#definedebug

#ifdefdebug

#endif

而在define.cpp原始檔中,**修改如下:

#include

#include"head.h"

intmain(intargc,char*ar**)

執行結果如下:

beginningexecutionofmain()

pressanykeytocontinue

結論:通過使用#ifdef指示符,我們可以區隔一些與特定標頭檔案、程式庫和其他檔案版本有關的**。

c語言之詳解#ifdef等巨集

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

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

#ifdef識別符號

//程式段1

#else

//程式段2

#endif

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

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

#ifdef識別符號

//程式段1

#endif

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

#ifdefwindows

#definemytypelong

#else

#definemytypefloat

#endif

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

#definewindows

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

#definemytypelong

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

#define windows

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

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

#ifdefdebug

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

#endif

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

#definedebug

則在程式執行時輸出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。可以事先給定一定條件,使程式在不同的條件下執行不同的功能。

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

#defineletter1

intmain(intargc,char*ar**)

return0;

}

執行結果為:

clanguage

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

#defineletter0

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

clanguage

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

UML 及其作用

uml unified modeling language,統一建模語言 是一組用於描述ooad過程的圖形化表達方式。uml為交流物件導向的設計中的需求,行為 體系結構的實現提供了一套綜合的表示法。uml繪製工具,ea 和vsu 2010 uml由9個不同型別的圖組成 用例圖 顯示了系統的外部可視行...

UML 及其作用

uml unified modeling language,統一建模語言 是一組用於描述ooad過程的圖形化表達方式。uml為交流物件導向的設計中的需求,行為 體系結構的實現提供了一套綜合的表示法。uml繪製工具,ea 和vsu 2010 uml由9個不同型別的圖組成 用例圖 顯示了系統的外部可視行...

UML 及其作用

uml unified modeling language,統一建模語言 是一組用於描述ooad過程的圖形化表達方式。uml為交流物件導向的設計中的需求,行為 體系結構的實現提供了一套綜合的表示法。uml繪製工具,ea 和vsu 2010 uml由9個不同型別的圖組成 用例圖 顯示了系統的外部可視行...