0

0

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

尼克

尼克

发布时间:2026-01-01 13:39:43

|

798人浏览过

|

来源于php中文网

原创

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

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

为什么 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,却忘了把对应实现编译进最终可执行文件。

立即学习C++免费学习笔记(深入)”;

XPaper Ai
XPaper Ai

AI撰写论文、开题报告生成、AI论文生成器尽在XPaper Ai论文写作辅助指导平台

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

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

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

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

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

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

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

220

2025.12.29

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

macOS怎么切换用户账户
macOS怎么切换用户账户

在 macOS 系统中,可通过多种方式切换用户账户。如点击苹果图标选择 “系统偏好设置”,打开 “用户与群组” 进行切换;或启用快速用户切换功能,通过菜单栏或控制中心的账户名称切换;还能使用快捷键 “Control+Command+Q” 锁定屏幕后切换。

324

2025.05.09

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1345

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

700

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.3万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号