
2.1.3 编译预处理
在一个C源程序中,除了变量和函数的定义、声明以及表达式等基本程序语句外,还包括一些#号开始的编译预处理命令(Preprocessor Directive)。这些预处理命令由编译器正式编译之前调用相应的预编译函数来解释和执行。主要的编译预处理功能有宏定义、文件包含及条件编译命令等。
1.宏定义
宏(Macro)定义是指用一个指定的名字来代表一个常量表达式或字符串,其复杂形式是带参数的宏。宏定义的一般格式为
#define标识符常量表达式或字符串
例如:

通常#define出现在源程序的首部,使用宏名之前一定要用#define进行宏定义。宏定义不是C语句,不必在行末尾加分号。也可以将常用的宏定义放到头文件中。
2.文件包含
文件包含是指一个程序文件将另一个指定文件的内容全部包含进来。一般格式为#include“被包含文件名”或#include<被包含文件名>
其中“被包含文件名”是一个已经存在于系统中的文件名字。被包含文件通常称为头文件,通常.h以作为后缀,例如:

其功能是将头文件“math.h”的内容嵌入该命令行处,使它成为源程序的一部分。当用一对尖括号时,编译系统按设定的标准目录搜索头文件。当用一对双引号时,编译系统先在源文件所在的目录中搜索,搜索不到,再按设定的标准目录搜索头文件。
文件包含预处理命令行通常放在文件的开头,被包含的文件内容通常是一些公用的宏定义,如外设寄存器定义或外部变量说明等。例如

使用包含文件应注意以下几点:
1)调用标准库函数,例如数学函数时,一定要包含所要用到的库文件。
2)头文件只能是ASCII文件,不能是目标代码文件。
3)一个#include命令只能包含一个头文件,若要包含多个头文件,需要用多个#include命令。
4)头文件包含可以嵌套,即被包含的头文件可以再包含其他的头文件。
3.条件编译
条件编译是在编译C文件之前,根据条件决定编译的范围。其格式有
(1)编译格式1

其功能是若标识符已被定义过,则对程序段1进行编译;否则对程序段2进行编译。可简化为

(2)编译格式2

其功能是若标识符未被定义过,则对程序段1进行编译;否则对程序段2进行编译。
例如:
