#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.找工作 如今社會,企業對員工的學歷要求越來越高,很多大公司招聘都要求本科或以上學歷的,如果學歷沒達...