ifdef有大用處

2022-02-22 03:56:11 字數 3810 閱讀 8380

#ifdef的用法

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

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

#include "iostream.h"

int main()

執行結果為:press any key to continue

改寫**如下:

#include "iostream.h"

#define debug

int main()

執行結果為:beginning execution of main()

press any key to continue

更一般的情況是,#define語句是包含在乙個特定的標頭檔案中。

比如,新建標頭檔案head.h,在檔案中加入**:

#ifndef debug

#define debug

#endif

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

#include "iostream.h"

#include "head.h"

int main()

執行結果如下:beginning execution of main()

press any key to continue

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

#ifdef等巨集

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

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

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

防止重複引用

如果乙個檔案被別的很多檔案從此引用,此時如果在別的檔案頭都加上#include《該檔案》,編譯就會出錯,提示某人函式被多次編譯等...,利用#ifndef就可以防止該類事件,在每乙個呼叫該檔案的檔案頭加上如下 定義就可以防止該錯誤:

#ifndef _xx_h_

#define _xx_h

#include《該檔案》

#endif

源文件 <>

如果想編寫乙個既可用 tc 編譯又可用 vc 編譯的程式,但不同的編譯器生成的可執行檔案的功能不同時, #ifdef 就有用了.

下面這個程式,如果用 vc 編譯,只會顯示一句話; 但若用 tc 編譯,既顯示一句話,又把背景顏色改為藍色。

這樣做的原因是 vc 沒有 textbackground() 這個函式, 為了不改變源程式而適應不同的編譯器, 這種條件編譯(conditional compilation)的方法比較有用.

另外,有些 windows api 對作業系統的版本有要求,這時條件編譯又可派上用場了.

*/ #include

#include

#ifdef win32 /*使用 visual c++ 6.0 作為編譯器時, "win32 " 自動被vc定義,*/

#define vc /*從而定義了 "vc "*/

#endif

int main(void)

源文件 <>

總結:條件編譯可以用在很多有用的場合,比如剛剛說的跨平台,跨編譯環境的差異,已經debug和release的差異,還有重複包含的預防.用好這個命令,會減少許多任務作,不僅如此,用這個命令在不同環境下的除錯也非常的有用.

C namespace 小點大用處

c 中的namespace只是很小的乙個點,但在專案規模越來越大和多人協作的場景中,起著十分重要的作用。例如我們寫測試例子,沒有必要建立建很多檔案,還要避免類名和方法名衝突,直接通過namespace進行隔離即可。程式如下 include using namespace std namespace ...

舊電腦也有大用處

當你的舊電腦執行速度變慢或出現故障時 怎麼處理掉它就成為乙個難 戴爾公司 dell inc.提供免費上門 任何一款戴爾舊電腦的服務。如果你購買了一台新的戴爾電腦或印表機 公司也能免費幫你搬走任何品牌的舊電腦或舊印表機。詳情可登入www.dell.com recycling查詢。惠普公司 hewlet...

自考本科有用嗎?對職業發展有多大用處

廣州自考本科有用嗎?有很多自考生對此還是有疑問的,下面成科教育就給大家解答下。廣州自考本科的學歷是國家承認社會認可的,可用於求職,公升職,加薪,考公務員,出國留學等等,具體如下 廣州自考本科有用嗎 1.找工作 如今社會,企業對員工的學歷要求越來越高,很多大公司招聘都要求本科或以上學歷的,如果學歷沒達...