全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++20的模块(Modules)怎么用 告别传统头文件的全新编译方式【教程】

C++20模块用export module声明接口单元、import替代#include,实现编译模型重构;接口单元导出内容供外部使用,未export的默认私有,import必须位于翻译单元最前面。

用 C++20 模块(Modules)替代头文件,核心就两点:用 module 声明接口单元,用 import 替代 #include。它不是语法糖,而是编译模型的重构——模块被单独编译成二进制接口文件(如 .pcm / .ifc),不再重复解析、宏污染或依赖顺序问题。

怎么写一个基础模块?

模块分接口单元(interface unit)和实现单元(implementation unit)。接口单元导出供别人用的内容,必须以 export module 开头:

math_utils.ixx(MSVC)或 math_utils.cppm(GCC/Clang 推荐后缀)

export module math_utils;
export int add(int a, int b) { return a + b; }
export namespace math {
constexpr double PI = 3.14159;
}

注意:
export 只修饰你想对外暴露的声明或定义(函数、变量、类、命名空间等)
• 不加 export 的内容默认私有,仅在本模块内可用
• 模块名(math_utils)是逻辑标识,不要求与文件名一致,但建议保持一致便于维护

怎么在其他文件里使用模块?

import,不是 #include,且必须出现在翻译单元最前面(不能在头文件里、不能在 #include 后面):

import math_utils;
int main() {
return add(2, 3); // OK
// std::cout << math::PI; // 需要额外 import (见下条)
}

常见组合:
import std; —— 导入标准库统一模块(C++23 起更成熟,C++20 多数编译器仍实验性支持)
import ; —— 导入传统头文件的“头文件单元”(需编译器开启对应选项,如 Clang 的 -fmodules-ts 或 MSVC 的 /experimental:module
import "my_header.h"; —— 导入自定义头文件作为模块(需先将其显式构建为头文件单元)

实际编译时要注意什么?

模块不是“写了就能跑”,编译流程变了:

  • 先编译接口单元生成模块接口文件(.ifc / .pcm): clang++ -std=c++20 -x c++-system-header -fmodules -fimplicit-modules -fimplicit-module-maps -c math_utils.cppm -o math_utils.ifc
  • 再编译主程序,告诉编译器去哪里找 .ifc: clang++ -std=c++20 -fmodules -fmodule-file=math_utils.ifc main.cpp -o main
  • MSVC 更简单些:直接 cl /std:c++20 /experimental:module /EHsc main.cpp math_utils.ixx,它自动处理依赖

关键提醒:
• 所有使用模块的源文件必须用相同标准(如都用 -std=c++20
• 模块接口文件路径需被正确识别(Clang 常需 -fmodule-map-file-fprebuilt-module-path
• 不同编译器对模块的支持程度不同:MSVC 最早落地,GCC 11+ 支持较稳,Clang 需 13+ 且配置较细

模块能完全取代头文件吗?现阶段怎么过渡?

不能立刻全切。建议分三步走:

  • 新项目直接用模块写核心逻辑(工具类、算法模块等)
  • 旧项目保留头文件,但把稳定、无宏、无模板特化的部分逐步封装成模块(例如把 utils.h 改成 utils.cppm
  • 第三方库暂不强求——除非它已提供模块化版本(如 Boost 1.82+ 开始实验性支持模块)

特别注意:模板定义必须在接口单元中可见(不能像头文件那样只声明),所以模块里写模板函数/类时,定义通常得和声明一起 export 出来。


# ai  # c++  # 命名空间  # include  # math  # int  # double  # 接口  # Interface  # Namespace  # 重构  # 头文件  # 能在  # 最前面  # 特化  # 就能  # 主程序  # 出现在  # 你想  # 将其 


相关文章: 建站之家VIP精选网站模板与SEO优化教程整合指南  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  浅谈Javascript中的Label语句  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  网站制作壁纸教程视频,电脑壁纸网站?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  网站制作公司排行榜,抖音怎样做个人官方网站  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  招贴海报怎么做,什么是海报招贴?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  智能起名网站制作软件有哪些,制作logo的软件?  北京专业网站制作设计师招聘,北京白云观官方网站?  如何快速搭建响应式可视化网站?  移民网站制作流程,怎么看加拿大移民官网?  网站制作网站,深圳做网站哪家比较好?  如何在IIS中新建站点并配置端口与IP地址?  建站主机核心功能解析:服务器选择与网站搭建流程指南  高防服务器租用如何选择配置与防御等级?  建站OpenVZ教程与优化策略:配置指南与性能提升  如何快速使用云服务器搭建个人网站?  如何在搬瓦工VPS快速搭建网站?  定制建站如何定义?其核心优势是什么?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  如何在橙子建站中快速调整背景颜色?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  Python路径拼接规范_跨平台处理说明【指导】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何通过WDCP绑定主域名及创建子域名站点?  如何在Windows虚拟主机上快速搭建网站?  建站主机功能解析:服务器选择与快速搭建指南  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  内网网站制作软件,内网的网站如何发布到外网?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  建站之星如何通过成品分离优化网站效率?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何用VPS主机快速搭建个人网站?  ,有什么在线背英语单词效率比较高的网站?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  临沂网站制作企业,临沂第三中学官方网站?  建站之星上传入口如何快速找到?  如何用好域名打造高点击率的自主建站?  小型网站制作HTML,*游戏网站怎么搭建?  建站之星后台管理:高效配置与模板优化提升用户体验  Java解压缩zip - 解压缩多个文件或文件夹实例  为什么Go需要go mod文件_Go go mod文件作用说明  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。