条件编译就是指有条件的编译,即根据条件去编译代码,在编译阶段时就对代码做出取舍,有的编译,有的不编译,这样比写成一个个判断函数更有效率,比如工程代码大部分的地方都类似,只有个别语句因为使用的硬件版本不同,就可以使用条件编译增加可移植性。
条件编译的“条件”,可以是一个表达式的值,也可以是一个定义的宏。
对于前者,如果该表达式为真,则编译下面的代码,为假则不编译。对于后者,如果定义了该宏,则编译下面的代码,未定义则不编译。
后者的情况,最常见的就是头文件使用的防止重复定义的写法。
#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”,条件编译使用表达式,根据它的值是多少来编译哪段代码,值由其它宏来决定。现在定义的是日元汇率,所以结果如下。