当我们将代码写到编译器上后,每次都是编译运行一下,来查看自己代码的结果。
而今天要说的就是编译这个环节,编译器到底替我们完成了什么样的一个操作。
我们经常口中说的编译可以分为这么四个阶段:预处理、编译、汇编和链接
首先来说预编译阶段:
1、将所有的“#define”删除,并且展开所有的宏定义。
2、处理所有的条件的预编译的命令,如“#if” “#ifdef” “#endif”。
3、处理所有的头文件,如“#include<stdio.h>”
4、删除所有的注释
5、增加行号和文件标识
6、保留所有的#pragma编译器指令
经过预编译阶段后,会生成.i文件,并且生成的 .i文件不包括任何宏定义,以为已经将宏定义全部展开了。
编译阶段:
这个阶段就是把预处理玩的文件进行一系列词法分析、语法分析、语义分析以及优化后产生的相应汇编代码文件,这个过程是往往是整个编译环节最重要的核心部分,这个阶段将.i文件生成为.asm文件。
汇编阶段:
汇编阶段是将生成的.asm文件中的汇编语言转化成机器可以执行的指令
链接阶段:
1、合并段和符号表
2、进行符号解析
3、分配所需的虚拟地址空间
4、符号重定义
这就是编译器为我们所做的事情。