C++20模块(Module)入门与实战:告别头文件的新范式
本文全面讲解C++20 Modules的核心概念、语法和使用方法,对比传统头文件的优劣,配合完整代码示例和编译指南,助你掌握C++编译模型的革命性变革。
一、为什么需要模块
1.1 头文件的痛点
C++传统头文件机制的问题:
// 1. 编译速度慢:每次#include都要重新解析
// math_utils.h
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <iostream>
// 每个包含此头文件的翻译单元都要解析这些头文件
// 2. 宏污染:宏没有作用域
#define MAX_SIZE 100 // 全局可见,可能冲突
// 3. 包含顺序依赖
// a.h依赖b.h,如果包含顺序不对就编译失败
// 4. ODR违规风险
// 不同翻译单元中同名实体可能定义不同
1.2 模块的优势
| 特性 | 头文件 | 模块 |
|---|---|---|
| 编译速度 | 慢(重复解析) | 快(预编译一次) |
| 宏作用域 | 全局 | 模块内 |
| 包含顺序 | 敏感 | 不敏感 |
| 符号可见性 | 粗粒度 | 精细控制 |
| 文本替换 | 是 | 否 |
| IDE支持 | 差 | 好 |
二、模块基础语法
2.1 定义模块
// math_utils.cppm (模块接口文件)
export module math_utils;
// 导出的函数(对外可见)
export int add(int a, int b) {
return a + b;
}
export int multiply(int a, int b) {
return a * b;
}
export double circle_area(double radius) {
return 3.14159265358979 * radius * radius;
}
// 不导出的函数(模块内部使用)
int internal_helper(int x) {
return x * 2;
}
2.2 使用模块
// main.cpp
import math_utils;
import <iostream>; // 标准库也可以用模块方式导入
int main() {
std::cout << "3 + 4 = " << add(3, 4) << "\n";
std::cout << "5 * 6 = " << multiply(5, 6) << "\n";
std::cout << "Area = " << circle_area(5.0
453



被折叠的 条评论
为什么被折叠?



