条件编译

条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。

1.条件编译中使用的预编译指令

#define            定义一个预处理宏
#undef            取消宏的定义

#if                   编译预处理中的条件命令,相当于C语法中的if语句
#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef            与#ifdef相反,判断某个宏是否未被定义
#elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
defined          与#if, #elif配合使用,判断某个宏是否被定义

宏定义,按照是否带参数通常分为对象宏、函数宏两种。
对象宏: 不带参数的宏被称为"对象宏(objectlike macro)"。对象宏多用于定义常量、通用标识。例如:

//常量定义
#define PRICE 30
// 预编译宏
#define DEBUG

 函数宏:带参数的宏。利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈, 这一过程如果过于频繁会耗费掉大量的CPU运算资源。 所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率。但多数c++程序不推荐使用函数宏,调试上有一定难度,可考虑使用c++的inline代替之。例如:

//最小值函数
#define MIN(a,b) (a

2.常见的条件编译的三种形式

(1) #if defined(或者是ifdef)  <标识符(条件)> 

     // 程序段

     #endif

(2)  #if !defined(或者是ifndef)  <标识符(条件)> 

      //程序段

     //endif

(3)  #if ()

      //程序段1

      #elif ()

      //程序段2

      .......

      #else

      //程序段n

       #endif

    <标识>在理论上来说可以是自由命名的,但每个头文件的“标识”应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

defined用来测试某个宏是否被定义。defined(name): 若宏被定义,则返回1,否则返回0。
它与#if、#elif、#else结合使用来判断宏是否被定义,乍一看好像它显得多余, 因为已经有了#ifdef和#ifndef。defined的特点在于可在一条判断语句中声明多个判别条件,而#ifdef和#ifndef则仅支持判断一个宏是否定义。

#if defined(VAX) && defined(UNIX) && !defined(DEBUG) 

在判断某个宏是否被定义时,应当避免使用#if,因为if检查的是表达式。所以只定义宏,而没有指定宏的值时,要检查宏不能使用#if、#elif,而应当使用#ifdef或#ifndef,或者使用#if defined(宏)、#if !defined()。

检查表达式时,才用#if、#elif,并且只有当#if、#elif后面的表达式为真时,才执行后面的程序段

条件编译_第1张图片  条件编译_第2张图片

条件编译_第3张图片   条件编译_第4张图片

 条件编译_第5张图片   条件编译_第6张图片

条件编译_第7张图片

你可能感兴趣的:(C++)