文章目录
1.被隐藏的过程
每一个hello world
的生成都会伴随着四个被隐藏起来的步骤,分别是预处理, 编译, 汇编, 链接
1.1预编译
首先是源代码文件hello.c和相关头文件,如stdio.h等被预编译器cpp预编译成一个.i文件
第一步预编译的过程相当于如下命令
gcc -E hello.c -o hello.i
预编译过程主要处理的规则如下
- 将所有的
#define
删除,并展开所有的宏定义 - 处理所有条件预编译指令,比如
#if
,#ifdef
,#elif
,#else
,#endif
- 处理
#include
预编译指令,将被包含的文件插入到改预编译指令的位置,注意这个过程是递归进行的,也就是说被包含的文件还可能包含其他文件 - 删除所有注释
//
和/* */
- 添加行号和文件名标识,比如
#2
,hello.c 2
,以便于编译时编译器产生的调试用的行号信息及用于编译时产生编译错误火警告时能够显示行号 - 保留所有的
#pragma
编译器指令,因为编译器必须要使用他们
经过预编译后的.i
文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i
文件中,所以当我们无法判断宏定义是否正确或头文件包含是否正确时,也可以查看预编译后的文件来确定问题
1.2编译
编译过程就是把预处理好的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
编译过程相当于如下命令
gcc -s hello.i -o hello.s
</