c预处理器在程序执行之前查看程序, 根据预处理指令, 将符号缩写替换为表示的内容, 预处理器可以包含程序需所需的其他文件, 选择让编译器查看哪些代码。基本上预处理器工作只是把一些文本转换为其他文本。
翻译程序的第一步
预处理之前编译器会对程序作出一些翻译处理:编译器将源文件中出现的字符映射, 该过程处理多字节字符和三字符序列;
随后编译器定位每个反斜杠后面跟着换行符的实例, 并删除他们, 将数个物理行(physical line)转换成一个逻辑行(logical line);
随后编译器把文本划分为预处理记号序列, 空白序列和注释序列, 编译器将用一个空格字符替换每一条注释。
最后程序进入预处理阶段, 查找一行中以#开始的预处理指令。
明示常量(manifest constant): #define
其也称为符号常量, 以#作为一行的开头, ANSI与后来的标准允许#前有空格或制表符。
但是该指令还有其他用途:
#include <stdio.h>
#define TWO 2
#define OW "Consistency is the last refuge of the unmagins\
tive. -Oscar Wilde"
#define FOUR TWO*TWO
#define PX printf("X is %d.\n", x)
#define FMT "X is %d.\n"
int main(void)
{
int x = TWO;
PX;
x = FOUR;
printf(FMT, x);
printf("%s\n", OW);
printf("TWO: OW\n");
return 0;
}
每行#define都由三部分组成:
- #define指令本身
- 选定的缩写, 也称为宏
(有些宏代表值, 这些宏称为类对象宏(object-like macro), 还有类函数宏(function-like macro), 宏的名称不允许有空格, 只能使用c变量的命名规则) - 称为替换列表或替换体, 程序在找到宏的示实例后, 用替换体代替这个宏, 其过程称之为宏展开(macro expansion).
(可以在#define行使用标准c注释)