C预处理器(preprocessor)在源代码编译之前对其进行一些文本性质的操作,它的主要任务包括删除注释,插入被#include指令包含的文件的内容,定义和替换由#define指令的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。
常用的预处理器符号:
符号 | 样例值 | 含义 |
__FILE__ | “name.c” | 进行编译的源文件名 |
__LINE__ | 25 | 文件当前行的行号 |
__DATE__ | “Jan 31 1997” | 文件被编译的日期 |
__TIME__ | “18:04:30” | 文件被编译的时间 |
__STDC__ | 1 | 如果编译器遵循ANSI C,其值就为1,否则为定义 |
宏用于非常频繁的执行简单的计算,比如在两个表达式中寻找其中的较大值的一个:
#define MAX(a, b) ((a) > (b) ? (a) : (b));
为什么不用函数来完成这个任务呢?有两个原因,首先:用于调用和从函数返回的代码很可能比实际执行这个小型计算工作的代码更大,所以使用宏比较使用函数在程序中的规模和速度方面都更加胜一筹。
但是,更为重要的是,函数的参数必须声明为一种特定的类型,所以它只能再类型合适的表达式上使用,反之,上面的这个宏可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以用的操作符比较值大小类型。
和使用函数相比,宏的不利之处在于每次使用宏时,一份定义代码的拷贝都将插入到程序中,除非宏非常短,否则使用宏可能会大幅增加程序的长度。
#undef name
这条预处理指令用于移除一个宏定义。