C++
程序的生命周期要经过编码(Coding)、预处理(Pre-processing)、编译(Compiling)和运行(Running)四个阶段。
- 编码即coding阶段,这阶段主要是定义变量,写语句,实现各种数据结构、函数和类。
- 预处理是
C/C++
程序独有的阶段,在这个阶段,预处理器(Pre-processor)将编码阶段产生的源码文件进行预处理 。“预处理”的功能是通过各种预处理指令,例如#include、#define、#if
等进行文字替换。 - 编译阶段,更准确地说,应该是“编译”和“链接”。
-
- 在编译阶段,预处理后的源码需要经过编译器和链接器,生成可以在计算机上运行的二进制机器码。在这个阶段,
C++
编译器要分词、语法解析、生成目标码,并尽可能地去优化。 - 在编译的过程中,编译器还会根据c++语言规则检查程序的语法、语义是否正确,发现错误就会导致编译失败,这就是cpp的“静态检查”。
- 在处理源码的时候,编译器会根据cpp语法检查各种类型、函数的定义,所以在这个阶段,可以以编译器为目标进行编程,有目标的控制编译器的行为,这即“模板元编程”。
- 在编译阶段,预处理后的源码需要经过编译器和链接器,生成可以在计算机上运行的二进制机器码。在这个阶段,
- 运行阶段即可以得到最终的结果,在这个阶段,可以做 GDB 调试、日志追踪、性能分析等以优化代码。
C++
的编译又可以细化为编译和链接,链接又分为静态链接、加载时的动态链接与运行时的动态链接。编译阶段只会对每个源代码分开编译,对于只有声明没有定义的函数,编译器会将其编译为一个符号,并期望在链接阶段找到这个函数的定义。对于一个只有声明没有定义的函数,如下所示,可以发现其会在链接阶段出错。
链接时,主要是链接函数和全局变量。无论是哪种链接方式,其最终都会生成可执行文件,只不过链接的时机不同。静态链接与动态链接的区别可以参考,简单来说,静态链接要比动态链接性能好,但是其会由于链接同样的模块而浪费内存,同时若使用动态链接,某个模块更改后,只需要重新编译这一模块即可,但是静态链接是需要全部编译的。
编译和链接的区别可以参考如下链接,之所以把编译和链接分开,是因为当使用动态链接时,我们可以单独编译某个模块,然后可以再用链接器链接其他的模块,通过这种方式,如果只修改某个模块,在编译时只需要编译此模块即可,并不需要编译整个模块,当需要最终的可执行程序时,可以将所有模块共同编译。