预编译过程:
预编译过程主要处理那些源代码文件中的以”#”开始的预编译指令。比如:”#include”,”#define”等,主要处理规则如下:
(1)将所有的”#define”删除,并且展开所有的宏定义。
(2)处理所有条件预编译指令,
比如”#if”,”#ifdef”,”#elif”,”#else”,”#endif”.
(3)处理”#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意:这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
(4)删除所有注释”//”和”/**/.
(5)添加行号和文件名标识,比如#2 ”hello.c” 2,以便与变异是编译器产生条使用的行号信息以及用于编译时产生编译错误或警告时能够显示行号。
(6)保留所有的”#pragma”编译器指令,因为编译器需要使用它们。
经过编译后的.i文件不包含任何宏定义,因为所有的宏定义都已经展开,并且包含的文件也已经被插入到.i文件中。