C/C++ 條件編譯


條件編譯就是指有條件的編譯,即根據條件去編譯代碼,在編譯階段時就對代碼做出取舍,有的編譯,有的不編譯,這樣比寫成一個個判斷函數更有效率,比如工程代碼大部分的地方都類似,只有個別語句因為使用的硬件版本不同,就可以使用條件編譯增加可移植性。

 

條件編譯的“條件”,可以是一個表達式的值,也可以是一個定義的宏。

 

對於前者,如果該表達式為真,則編譯下面的代碼,為假則不編譯。對於后者,如果定義了該宏,則編譯下面的代碼,未定義則不編譯。

 

后者的情況,最常見的就是頭文件使用的防止重復定義的寫法。

#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”,條件編譯使用表達式,根據它的值是多少來編譯哪段代碼,值由其它宏來決定。現在定義的是日元匯率,所以結果如下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM