全网整合营销服务商

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

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

c++如何使用C++20 Modules模块_c++ import语法与编译速度提升【教程】

import 不会自动找模块文件,因 C++20 Modules 依赖编译器显式预编译接口单元(如 .ixx)生成 PCM 二进制,并通过 -fmodule-file= 等参数指定路径,而非按名查找源文件或头文件。

为什么 import 不会自动找到模块文件

因为 C++20 Modules 不是“按名查找”,而是依赖编译器对模块接口单元(.ixx.cppm)的显式编译与导出。你写 import math_utils;,编译器不会去头文件目录翻 math_utils.h,也不会扫描当前目录找同名文件——它只认已生成的模块二进制(如 math_utils.pcm)且需通过 -fmodule-file=--precompile 显式提供路径。

  • Clang 默认不自动生成或缓存 PCM 文件,每次都要手动预编译接口单元
  • MSVC 要求模块接口单元必须用 /interface 编译,且 import 语句所在 TU 必须用 /reference 指向对应 PCM
  • gcc 13+ 支持有限,仍需 -fmodules-ts + -fmodule-file=,且不支持跨目录隐式解析

如何正确编译一个模块并被其他文件 import

以 Clang 15+ 为例(Linux/macOS),关键在于两步分离:先预编译接口单元,再编译导入单元。

clang++ -std=c++20 -x c++-system-header -fmodules -fimplicit-modules -fmodule-map-file=module.modulemap -c math_utils.ixx -o math_utils.pcm
clang++ -std=c++20 -fmodules -fmodule-file=math_utils.pcm main.cpp -o main

其中:

  • math_utils.ixx 是模块接口单元,含 export module math_utils;export 声明
  • module.modulemap 非必需,但若想让模块名映射到文件路径,需显式声明:
    module "math_utils" { header "math_utils.ixx" isystem "." }
  • -fimplicit-modules 允许自动加载标准库模块(如 import std.core;),但不会帮你找自定义模块

import 后为什么链接失败或符号未定义

模块接口单元(.ixx)只导出声明,不包含实现;实现必须放在模块实现单元(.cpp)中并参与链接。常见错误是只编译了接口单元 PCM,却忘了把对应实现编译进最终可执行文件。

  • 模块接口单元里 export 的函数,必须在某个 .cpp 文件里有非 inline 定义(除非加 inline 或写在头文件内联区)
  • Clang 下,实现单元仍要用 -fmodules 编译,否则无法识别模块内部符号依赖
  • MSVC 中,模块实现单元必须用 /implementation 编译,且不能同时用 /interface

编译速度提升真实吗?哪些场景反而更慢

模块确实能跳过预处理器、避免重复解析头文件,但提速效果高度依赖项目结构和构建系统配合。实测中,以下情况可能变慢:

  • 小项目( 头文件重用收益
  • 频繁修改接口单元:每次改 .ixx 都触发整个模块 PCM 重建,所有 import 它的文件全量重编
  • CI 环境无模块缓存:PCM 文件未复用,等于每次从零预编译
  • 混合使用传统头文件和模块:编译器需维护两套依赖模型,中间表示膨胀

真正受益的是大型代码库,尤其是接口稳定、实现常变、头文件嵌套深(如 #include 这种)的场景。

模块不是银弹,它把“头文件管理复杂度”换成了“PCM 生命周期管理复杂度”。没配好构建脚本前,别指望一键加速。


# linux  # 处理器  # mac  # ai  # c++  # macos  # cos  # 标准库  # 为什么  # include  # 预处理器  # 接口  # Interface  # 头文件  # 的是  # 放在  # 尤其是  # 都要  # 要用  # 自定义  # 不支持  # 为例  # 而非 


相关文章: 济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何确认建站备案号应放置的具体位置?  再谈Python中的字符串与字符编码(推荐)  制作网站怎么制作,*游戏网站怎么搭建?  如何挑选优质建站一级代理提升网站排名?  建站之星安装需要哪些步骤及注意事项?  建站之星如何实现网站加密操作?  深入理解Android中的xmlns:tools属性  制作旅游网站html,怎样注册旅游网站?  建站ABC备案流程中有哪些关键注意事项?  如何选择CMS系统实现快速建站与SEO优化?  建站之星图片链接生成指南:自助建站与智能设计教程  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  红河网站制作公司,红河事业单位身份证如何上传?  建站之星安装后如何自定义网站颜色与字体?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何在万网自助建站中设置域名及备案?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  详解jQuery停止动画——stop()方法的使用  广东专业制作网站有哪些,广东省能源集团有限公司官网?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  建站OpenVZ教程与优化策略:配置指南与性能提升  如何通过商城自助建站源码实现零基础高效建站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  香港服务器选型指南:免备案配置与高效建站方案解析  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  ppt制作免费网站有哪些,ppt模板免费下载网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何在阿里云完成域名注册与建站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  建站主机解析:虚拟主机配置与服务器选择指南  如何在阿里云ECS服务器部署织梦CMS网站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  建站之星云端配置指南:模板选择与SEO优化一键生成  想学网站制作怎么学,建立一个网站要花费多少?  如何选择香港主机高效搭建外贸独立站?  购物网站制作公司有哪些,哪个购物网站比较好?  免费网站制作appp,免费制作app哪个平台好?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  建站之星安装后界面空白如何解决?  如何用免费手机建站系统零基础打造专业网站?  建站VPS能否同时实现高效与安全翻墙?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  北京专业网站制作设计师招聘,北京白云观官方网站? 

您的项目需求

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