标准C和C++将编译过程定义为9个阶段(Phases of Translation):
1.字符映射(Character Mapping)
文件中的物理源字符被映射到源字符集中,其中包括三字符运算符的替换、控制字符(行尾的回车换行)的替换。许多非美式键盘不支持基本源字符集中的一些字符,文件中可用三字符来代替这些基本源字符,以??为前导。但如果所用键盘是美式键盘,有些编译器可能不对三字符进行查找和替换,需要增加-trigraphs编译参数。在C++程序中,任何不在基本源字符集中的字符都被它的通用字符名替换。
2.行合并(Line Splicing)
以反斜杠\结束的行和它接下来的行合并。
3.标记化(Tokenization)
每一条注释被一个单独的空字符所替换。C++双字符运算符被识别为标记(为了开发可读性更强的程序,C++为非ASCII码开发者定义了一套双字符运算符集和新的保留字集)。源代码被分析成预处理标记。
4.预处理(Preprocessing)
调用预处理指令并扩展宏。使用#include指令包含的文件,重复步骤1到4。上述四个阶段统称为预处理阶段。
5.字符集映射(Character-set Mapping)
源字符集成员、转义序列被转换成等价的执行字符集成员。例如:'\a'在ASCII环境下会被转换成值为一个字节,值为7。
6.字符串连接(String Concatenation)
相邻的字符串被连接。例如:"""hahaha""huohuohuo"将成为"hahahahuohuohuo"。
7.翻译(Translation)
进行语法和语义分析编译,并翻译成目标代码。
8.处理模板
处理模板实例。
9.连接(Linkage)
解决外部引用的问题,准备好程序映像以便执行。