C标准定义了翻译的八个阶段:
物理源多字节字符和三元组序列被映射到源字符集的字符.
每个反斜杠后跟一个换行符都会被删除(将两行拼接在一起).
源字符被分组到预处理标记中,每个空白字符序列都被替换为一个空格,但保留换行符.
执行预处理指令和_Pragma操作符,并展开宏调用.
字符串和字符常量中的源字符被转换为执行字符集.
相邻的字符串字面值连接在一起.
每个预处理标记都被转换为语法标记,并且空白字符分隔的标记被丢弃.分析和翻译(编译)生成的令牌.
所有外部参照都已解析(程序已链接).
第一阶段到第六阶段通常被认为是初步的或"预处理".编译的主要工作是在阶段7,"分析并翻译(编译)得到的令牌".
这些阶段在很大程度上是概念性的,用于描述C程序的语义,而不是指定工作是如何实际完成的.阶段1到6不一定是在编译期间按时间顺序执行的;它们可以内置于编译器的 struct 中.这甚至可能包括第七阶段.
阶段8通常作为单独的步骤执行,使用单独的链接器而不是编译器.