讲师中心 微信公众号
AI工具推荐 视频效率加速

c++20 modules用法 c++如何使用模块替代头文件

千婷小哥_7452

千婷小哥_7452

发布时间:2026-03-23 16:09:12

|

794人浏览过

|

来源于php中文网

原创

C++20模块需用export显式导出符号,export module必须为首行非注释语句;导入用import实现编译器级链接,非文本替换;构建系统须显式支持.ifc/.pcm生成与引用,否则无法解析符号。

c++20 modules用法 c++如何使用模块替代头文件

模块怎么写、怎么导出符号 C++20 模块不是“把头文件改个后缀”,它要求显式声明哪些名字对外可见。export 是核心动作,没加它,哪怕定义在模块文件里,别的单元也看不到。
  • export module 必须是文件第一行非空非注释行(否则编译器直接报错 module declaration must appear at global scope)
  • 只有被 export 修饰的声明才可被导入:比如 export struct Foo { int x; }; 可以,但 struct Bar { ... }; 不行,哪怕它在同一个 .ixx 文件里
  • 模块接口文件通常用 .ixx 后缀(MSVC)或 .mpp(Clang),但后缀本身不决定语义,靠 export module 识别
  • 如果要导出多个声明,可以包在 export { ... } 块里,避免重复写 export
// math.ixx
export module math;
export import <cmath>;
<p>export namespace math {
export const double PI = 3.14159;
export int add(int a, int b) { return a + b; }
}</p>

模块怎么导入、和 #include 有什么区别import 不是文本替换,不触发预处理,也不依赖包含路径;它是编译器级的符号链接。这意味着:
  • import 语句不能放在头文件里(模块不能“嵌套导入”到头文件中再被 #include)
  • 导入顺序无关,多次 import math; 不会重复编译,也不需要 #pragma once 或 include guard
  • 不能用 import "path/to/file.h" 导入传统头文件(除非用 import <stdio.h> 这种头单位模块,且需编译器支持)
  • MSVC 要求模块接口文件先编译成二进制模块接口文件(.ifc),Clang 使用 .pcm,必须确保构建系统生成并引用了它们

常见错误现象:error: 'add' was not declared in this scope,往往是因为忘了 export,或者模块文件根本没参与编译(构建系统没配置模块编译规则)。

构建系统怎么配才跑得起来 C++20 模块不是“开个编译器开关就自动支持”的功能。它依赖编译器对模块接口的生成与消费链路,而主流构建系统原生支持仍较弱。
  • CMake 3.28+ 才有实验性 cmake_language(DEFER) 和 add_module() 支持,但实际项目中更稳妥的是用 add_library(... INTERFACE) + 自定义命令调用编译器生成 .ifc
  • Clang 需要分两步:先用 clang++ -x c++-system-header -std=c++20 -fmodules -emit-module-interface -o math.pcm math.ixx 生成模块接口,再在主文件里 import math; 并用 -fprebuilt-module-path=. 指向它
  • MSVC 要求 /interface 编译选项生成 .ifc,并用 /reference math.ifc 导入;且模块文件必须在源文件列表中显式列出,不能靠 glob 匹配
  • 混用模块和头文件时,#include 的头文件无法看到模块导出的符号(反之亦然),二者符号域隔离——这不是 bug,是设计使然

什么时候不该急着切模块 模块解决的是头文件带来的 ODR、宏污染、编译依赖爆炸问题,但现阶段落地成本高:
  • 第三方库几乎全是头文件形式,你写了模块,但依然得 #include <json.hpp>,没法统一
  • 模块接口文件不能含宏定义(export 不作用于宏),所有跨模块的配置宏还得靠传统方式传递
  • 调试信息支持弱:GDB/LLDB 对模块符号的展开、断点设置不如头文件稳定
  • Windows 上 MSVC 的模块二进制格式不兼容 Clang,跨工具链协作基本不可行

真正适合模块的场景其实是内部基础库重构:比如把公司自研的容器、日志、序列化模块化,控制导出粒度,切断隐式依赖。别一上来就想替代 vector 或 string。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

模块不是语法糖,是编译模型的重写。你得先让构建系统认得清 .ifc 和 .pcm,再谈怎么组织接口。否则连 import 都报找不到模块,不是代码写错了,是构建漏了一环。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2035

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2942

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

996

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3339

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5739

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

929

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2640

2023.10.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5739

2023.08.02

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn