一、本文主要介绍C语言中关于条件编译相关的预处理命令,包含#define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif。
#define | 定义一个预处理宏 |
#undef | 取消一个预处理宏 |
#ifdef | 判断某个预处理宏是否被定义,若定义则编译后续程序段 |
#ifndef | 判断某个预处理宏是否没有被定义,若没定义则编译后续程序段 |
#if | 判断某个预处理宏的值是否不为0,不为0则编译后续程序段,相当于C语法中的if语句 |
#elif | 相当于C语法中的else if 与#if配套使用 |
#else | 相当于C语法中的else 与#if、#elif配合使用 |
#endif' | 结束条件命令的判断,与#if、#ifdef、#ifndef配套使用 |
二、条件编译
预处理程序提供了条件编译的功能,可以按不同的条件去编译不同的程序代码,从而产生不同的目标代码文件。
1.#define
在编译预处理的时候,编译器会对程序中出现的“宏”都用宏定义中的字符串去替换掉宏,需要注意的是,字符串与替换这两个词。
#define PI 3.1416 //定义宏PI代替圆周率
最常用的宏定义用法如上,定义字符串宏(PI)后的程序段只要用到了宏(PI),程序在编译的时候,会使用3.1416这个字符串将PI替换掉。
#define MIN(a, b) (a) > (b) ? (b) : (a) //求最小值
#define MAX(a, b) (a) > (b) ? (a) : (b) //求最大值
#define ADD (a + b)
例如这些定义的宏里面带有计算的,宏表达式里面的括号一定要加上,例如
#define ADD1 a + b
#define ADD2 (a + b)
int result = 0;
result = ADD1 + ADD1; //结果为 a + b + a + b
result = ADD2 + ADD2; //结果为 (a + b) + (a + b) 使用两条宏定义的结果一样
result = ADD1 * ADD1; //结果为 a + b * a + b
result = ADD2 * ADD2; //结果为(a + b) * (a + b) 使用两条宏定义的结果不一样了
编译器在编译预处理时是将宏名进行替换,所以宏里面的表达式一定要加好括号。避免调用宏时因为运算符优先级的问题出错。
还要一种特殊情况不建议使用宏定义具体代码如下:
#define SQU(a) (a * a) //
int main(int argc, const char *argv[])
{
int i = 1;
int result = 0;
result = SQU(i++);
printf("%d \n", result);
return 0;
}
//结果很容易分析出来是:2
//rusult = i++ * i++ = 1 * 2;
对于这种带有++,--运算的时候,不建议使用宏,特别容易出错。
在这里稍微提一下,若是在程序定义大量宏来固化一些数据的话,不如使用枚举,使用枚举的效果一样,但是枚举变量还能作为实参传入函数当中。
2.#undef
取消一个宏定义;
#define ADD(a, b) (a + b)
int i = 0;
int v1 = 1;
int v2 = 2;
int result = 0;
result = ADD(v1, v2);
#undef ADD(a, b)
//若在#undef还调用ADD(a, b)的宏,编译程序的时候,编译器会报错
3.#ifdef、#ifndef、#if与#elif
#ifdef、#ifndef与#if的作用相同,只是判断条件不同。
常用形式如下:
//第一种形式
#ifdef 标识符1 //若标识符1已被#define语句定义则只编译程序段1,否则继续判断后面的语句
程序段1
#elif 标识符2
程序段2
#else
程序段3
#endif
//第二种形式
#ifndef 标识符1 //若标识符1没有被#define语句定义则只编译程序段1,否则继续判断后面的语句
程序段1
#elif 标识符2
程序段2
#else
程序段3
#endif
//第三种形式
#if 常量表达式1 //若常量表达式1的值不为0则只编译程序段1,否则继续判断后面的语句
程序段1
#elif 常量表达式2
程序段2
#else
程序段3
#endif
下面程序举例:
#include <stdio.h>
#define IFDEF 1
#define IFNDEF 1
#define IF 1
#define NIF 1
int main(int argc, const char *argv)
{
#ifdef IFDEF
printf("define IFDEF\n");
#elif IFNDEF
printf("define IFNDEF\n");
#else
printf("no define \n");
#endif
#if IF
printf("define IF \n");
#elif NIF
printf("define NIF \n");
#else
printf("no define \n");
#endif
}
若宏定义为
#define IFDEF 1
#define IFNDEF 1
#define IF 1
#define NIF 1
程序编译后的执行结果是
define IFDEF
define IF
若宏定义为
#define IFNDEF 1
#define IF 0
#define NIF 1
程序编译后的执行结果是
define IFNDEF
define NIF
仓促成文,不当之处,尚祈方家和读者批评指正。联系邮箱1772348223@qq.com