Modules 模块(C++20)
一句话
用模块接口文件(.cppm)替代头文件——编译一次后缓存结果,大幅加速重编译,同时隔离宏污染并提供真正的符号可见性控制。
头文件
无(语言特性,使用新的文件类型和关键字)
核心 API 速查
| 语法 | 说明 |
|---|---|
module; | 全局模块片段起始(放 #include 等预处理指令) |
export module mylib; | 声明模块接口单元,导出模块名 mylib |
export int func(); | 导出声明,对模块使用者可见 |
module mylib; | 模块实现单元(不导出,仅实现) |
import mylib; | 导入模块(替代 #include) |
export import :sub; | 再导出子模块 |
module :private; | 私有模块片段(C++20),实现细节不参与模块接口 |
最小示例
cpp
// Standard: C++20
// --- math.cppm (模块接口) ---
export module math;
export int add(int a, int b) {
return a + b;
}
// --- main.cpp (使用者) ---
import math;
#include <iostream>
int main() {
std::cout << add(2, 3) << "\n"; // 5
}嵌入式适用性:中
- 编译加速:模块接口编译一次后缓存,大型项目重编译时间可减少 30-70%
- 宏隔离:模块边界外部的
#define不会泄漏进模块内部,提升构建稳定性 - 符号可见性:
export显式控制 API 边界,替代头文件"一切公开"的模式 - 构建系统支持尚不完善:CMake 对 modules 的原生支持在 3.28+ 逐步完善
- 各编译器实现存在兼容性问题(模块 BMI 格式不通用),跨编译器构建需谨慎
- 嵌入式工具链(尤其交叉编译场景)modules 支持滞后,短期不建议在嵌入式项目核心中采用
编译器支持
| GCC | Clang | MSVC |
|---|---|---|
| 11 | 16 | 19.28 |
另见
部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可