模块(或预编译模块,PCM)可以视为预编译头文件进化的下一步,也代表了一种以二进制形式存在的解析过的 AST(抽象语法树),但形成了一种 DAG(有向无环图),意味着一个模块可以包含多个其他模块。 与预编译头文件相比,这是一个重大的改进,在每个编译单元中只能引入一个预编译头文件。 C++20 标准引入了与模块相关的两个概念。第一个是普通模块,描述在 [^1] 的第 10 节中。另一个是所谓的头单元,主要描述在第 15.5 节中。头单元可以视为普通头文件和模块之间的中间步骤,并允许使用导入指令来导入普通头文件。 我们将关注 Clang 模块,这可以视为 C++ 标准中头单元的实现。使用 Clang 模块有兩種不同的选项:显式模块和隐式模块。