我们拿到一个.c或者是.cpp源文件,它是怎么样一步步的变化成一个机器可执行文件的呢?程序的一般编译流程主要包括四大部分:预处理、编译、汇编和链接。下面讲解这四步的具体工作,带你了解源文件到可执行文件是怎样生成的。
编译过程
- 1. 预处理(Preprocess)
- 2. 编译(Compilation)
- 3. 汇编(Assemoly)
- 4. 链接(Linking)
1. 预处理(Preprocess)
这一步由预处理器完成,对源程序中的伪指令(以#开头的指令)和特殊符号进行处理,伪指令包括宏定义指令、条件编译指令和头文件中包含的指令。这一步的主要工作包括以下内容:
- 将所有的#define删除,并将宏定义进行宏展开;
- 处理所有条件编译指令,如#if、#ifdef、#ifndef、#else、#elif、#endif等;
- 处理 #include预编译指令,将被包含的头文件内容插入该预编译指令的位置,如果是多重包含的话会递归执行;
- 处理其他宏指令,包括#error、#warning、#line、#pragma;
- 处理所有注释(C++的//,C语言的/**/),一般会用一个空格来代替连续的注释;
- 添加行号和文件标识,以便于编译时编译器产生调试用的行号信息及编译时产生编译错误和警告时可以把行号打印出来;
- 保留所有的#pragma编译器指令;
- 处理预定义的宏:如__DATE__、__FILE__等;
- 处理三元符:比如会将” />