條件編譯就是指有條件的編譯,即根據條件去編譯代碼,在編譯階段時就對代碼做出取舍,有的編譯,有的不編譯,這樣比寫成一個個判斷函數更有效率,比如工程代碼大部分的地方都類似,只有個別語句因為使用的硬件版本不同,就可以使用條件編譯增加可移植性。
條件編譯的“條件”,可以是一個表達式的值,也可以是一個定義的宏。
對於前者,如果該表達式為真,則編譯下面的代碼,為假則不編譯。對於后者,如果定義了該宏,則編譯下面的代碼,未定義則不編譯。
后者的情況,最常見的就是頭文件使用的防止重復定義的寫法。
#ifndef _ABCD_H_ #define _ABCD_H_ /* ...... */ #endif
首先,如果沒有定義_ABCD_H_,就定義這個宏,然后跟一段代碼,以“endif”結束。此“endif”對應的是開頭“ifndef”的“if”,把中間的所有代碼包裹起來。
那么,編譯時把所有文件包含起來,第一次編譯到此處時,會定義_ABCD_H_並編譯下面的代碼。往下繼續編譯時,倘若有其它文件引用了這個頭文件,會再次遇到這一段代碼,然后發現_ADCD_H_已經被定義,所以“ifndef _ADCD_H_”后面的代碼都不會編譯,這樣就防止了頭文件的重復定義。
通用條件編譯指令:
- #if:如果條件為真,則執行相應操作
- #elif:如果前面條件為假,而該條件為真,則執行相應操作
- #else:如果前面條件均為假,則執行相應操作
- #endif:結束相應的條件編譯指令
- #ifdef:如果該宏已定義,則執行相應操作
- #ifndef:如果該宏沒有定義,則執行相應操作
另外,想要取消宏的定義,可以用“#undef”加宏名來取消宏定義。
練習
定義三個匯率,第一個是人民幣對美元,第二個是人民幣對歐元,第三個是人民幣是日元。
用戶輸入人民幣數量,輸出能換多少對應幣種。
使用宏去控制程序換算哪種貨幣。
extra.h
#ifndef _EXTRA_H_ #define _EXTRA_H_ #include<iostream> #define USD_PER_CNY (0.1422) #define EUR_PER_CNY (0.1278) #define JPY_PER_CNY (15.4651) #define EXCHANGE_USD 0 #define EXCHANGE_EUR 1 #define EXCHANGE_JPY 2 #define CURRENT_EXCHANGE EXCHANGE_JPY #endif // _EXTRA_H_
main.cpp
#include "extra.h" void cal_exchange() { double mon_i; double mon_o; std::cout<<"How much money(yuan): "; while(std::cin>>mon_i) { #if CURRENT_EXCHANGE == EXCHANGE_USD mon_o = mon_i*USD_PER_CNY; #elif CURRENT_EXCHANGE == EXCHANGE_EUR mon_o = mon_i*EUR_PER_CNY; #else mon_o = mon_i*JPY_PER_CNY; #endif // CURRENT_EXCHANGE std::cout<<"Money exchanged: "<<mon_o<<"\n"; std::cout<<"How much money(yuan): "; } } int main() { cal_exchange(); }
頭文件里控制的宏是“CURRENT_EXCHANGE”,條件編譯使用表達式,根據它的值是多少來編譯哪段代碼,值由其它宏來決定。現在定義的是日元匯率,所以結果如下。