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”,条件编译使用表达式,根据它的值是多少来编译哪段代码,值由其它宏来决定。现在定义的是日元汇率,所以结果如下。

 

posted @ 2019-11-05 11:37  MorpheusDong  阅读(2783)  评论(0编辑  收藏  举报