C++的编译 / 链接模型
简单的加工模型
问题: 无法处理大型程序
-
加工耗时较长
-
即使少量修改,也需要全部重新加工
解决方案:分块处理
好处
-
编译耗资源但一次处理输入较少
-
链接输入较多但处理速度较快
-
便于程序修改升级
由"分块处理"衍生出的概念
-
定义 / 声明
-
头文件 / 源文件
-
翻译单元
源文件 + 相关头文件(直接/间接) - 应忽略的预处理语句
-
一处定义原则
程序级:一般函数
翻译单元级:内联函数、类、模板
编译/链接模型
预处理
-
将源文件转换为翻译单元
-
防止头文件被循环展开
#ifdef解决方案#pragma once解决方案
编译
- 将翻译单元转换为相应的汇编语言表示
- 编译优化
https://godbolt.org/z/zh9aqx - 增量编译 v.s. 全部编译
链接
- 合并多个目标文件,关联声明与定义
- 连接(Linkage)种类:内部连接、外部连接、无连接
- 链接常见错误:找不到定义
C++ 编译/链接过程是复杂的,预处理、编译与链接都可能出错
编译可能产生警告、错误,都要重视