Skip to content

Latest commit

 

History

History
51 lines (29 loc) · 2.21 KB

compilationProcess.md

File metadata and controls

51 lines (29 loc) · 2.21 KB

编译过程

C++从代码到可执行二进制文件的过程?

预编译:

(1) 将所有的#define删除,并且展开所有的宏定义

(2) 处理所有的条件预编译指令,如#if、#ifdef

(3) 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。

(4) 过滤所有的注释

(5) 添加行号和文件名标识。

编译:

(1) 词法分析:将源代码的字符序列分割成一系列的记号。

(2) 语法分析:对记号进行语法分析,产生语法树。

(3) 语义分析:判断表达式是否有意义。

(4) 代码优化:

(5) 目标代码生成:生成汇编代码。

(6) 目标代码优化:

汇编:

这个过程主要是将汇编代码转变成机器可以执行的指令。

链接:

将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。

  • 静态链接,是在链接的时候就已经把要调用的函数或者库链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。静态链接的另一个优点是速度快,但是链接的时候可能同一个库链接了好几次,导致空间浪费,而且如果该库更新了的话,整个程序需要重新编译。
  • 动态链接,是在链接的时候没有把调用的函数函数或者库链接进去,而是在执行的过程中,再去找要链接的函数或者库,生成的可执行文件中没有它们的函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

宏函数返回两数的最大值?

#define MAX(a,b) (a)>(b)?(a):(b)

int c = MAX(1,2);

C++预处理器?

  • 预处理器是一些指令,指示编译器在实际编译之前(预编译)所需完成的预处理。
  • 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。