当前位置: 首页 > news >正文

【C++】Module CPP:模块化编程 Demo

一、C++20 模块简介

C++20 模块是 C++ 语言发展史上的重要革新,它从根本上改变了代码组织方式。相比传统的头文件(#include)机制,模块具有以下核心优势:

  1. 隔离编译:模块独立编译,避免重复编译头文件
  2. 符号控制:通过 export 精确控制导出内容
  3. 消除污染:不会引入无关的宏定义和符号
  4. 加快编译:生成预编译模块接口(BMI)提升编译速度
  5. 强封装性:实现真正的逻辑单元封装

二、项目结构解析

cpp20-module-demo/
├── CMakeLists.txt           # 项目主配置
├── main.cpp                 # 入口文件
├── math/                    # 数学模块
│   ├── CMakeLists.txt       # 模块级配置
│   ├── math.cppm            # 模块接口声明
│   └── math_impl.cpp        # 模块具体实现
└── io/                      # IO模块(结构同上)

文件扩展名说明:.cppm 是模块接口单元的惯用扩展名,但并非强制要求

三、模块接口单元详解

1. 数学模块接口(math.cppm)

module;                            // 全局模块段开始
#include <iostream>                // 必须在此包含标准库头文件export module math;                // 声明并导出模块export int add(int a, int b);      // 导出函数声明
export int multiply(int a, int b); // 另一个导出函数

关键要素解析:

  • module; 开启全局模块段,用于包含传统头文件
  • export module 声明模块并导出接口
  • export 关键字控制导出的符号

2. IO模块接口(io.cppm)

module;
#include <iostream>  // 标准库必须前置包含export module io;export void print_result(const char* label, int value);

重要规则:

  • 所有标准库头文件必须在全局模块段包含
  • 接口文件中只能包含不会产生冲突的头文件
  • 导出的函数必须显式声明返回类型

四、模块实现单元详解

1. 数学模块实现(math_impl.cpp)

module math;  // 指定所属模块int add(int a, int b) {return a + b;
}int multiply(int a, int b) {return a * b;
}

2. IO模块实现(io_impl.cpp)

module;                  // 开启全局模块段
#include <iostream>      // 实现中使用标准库也需要前置包含module io;               // 指定所属模块void print_result(const char* label, int value) {std::cout << label << value << std::endl;
}

实现单元要点:

  • 不需要 export 关键字
  • 若实现中用到标准库,仍需在全局模块段包含
  • 实现文件与接口文件通过 module 模块名 建立关联

五、主程序模块导入

import math;  // 导入数学模块
import io;    // 导入IO模块int main() {int sum = add(3, 4);       // 使用模块导出函数int product = multiply(3, 4);print_result("Sum:    ", sum);print_result("Product:", product);return 0;
}

导入机制特点:

  • import 取代传统 #include
  • 只能访问模块导出的符号
  • 导入顺序无关紧要

六、CMake 配置解析

1. 顶层配置(CMakeLists.txt)

cmake_minimum_required(VERSION 3.28)
project(cpp20_module_demo LANGUAGES CXX)set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_EXTENSIONS OFF)# 强制使用支持模块的生成器
if (NOT CMAKE_GENERATOR MATCHES "Ninja" AND NOT MSVC)message(FATAL_ERROR "请使用 Ninja 或 MSVC 构建系统")
endif()add_subdirectory(math)
add_subdirectory(io)add_executable(cpp20-module-demo main.cpp)
target_link_libraries(cpp20-module-demo PRIVATE math_mod io_mod)

关键配置:

  • 要求 CMake 3.28+ 以获得完整模块支持
  • 必须使用 Ninja 或 MSVC 生成器
  • 通过 target_link_libraries 隐式传递模块依赖

2. 模块级配置(math/CMakeLists.txt)

add_library(math_mod)target_sources(math_modPUBLICFILE_SET cxx_modules TYPE CXX_MODULES FILES math.cppmPRIVATEmath_impl.cpp
)set_target_properties(math_mod PROPERTIESCXX_STANDARD 20CXX_EXTENSIONS OFF
)

模块构建要点:

  • FILE_SET cxx_modules 声明模块接口文件
  • 接口文件放在 PUBLIC 作用域
  • 实现文件放在 PRIVATE 作用域
  • 必须显式设置 C++20 标准

3. 模块级配置(io/CMakeLists.txt)

add_library(io_mod)target_sources(io_modPUBLICFILE_SET cxx_modules TYPE CXX_MODULES FILES io.cppmPRIVATEio_impl.cpp
)set_target_properties(io_mod PROPERTIESCXX_STANDARD 20CXX_EXTENSIONS OFF
)

七、构建与运行指南

  1. 生成构建系统(使用 Ninja):
mkdir build
cd build
cmake -G Ninja ..
  1. 编译项目:
cmake --build .
  1. 运行程序:
./cpp20-module-demo

预期输出:

Sum:    7
Product:12

八、重要注意事项

  1. 头文件包含规则

    • 所有 #include 必须位于全局模块段
    • 模块单元中禁止包含可能产生冲突的头文件
  2. 模块实现单元

    • 必须严格对应接口单元命名
    • 同一模块可以有多个实现单元
    • 实现单元之间不可见彼此的非导出符号
  3. 构建系统限制

    • 目前只有 MSVC 和 Clang 提供完整支持
    • GCC 的模块实现仍在开发中
    • CMake 需要 3.28+ 版本
  4. 符号可见性

    • 未导出的符号具有模块内部链接性
    • 不同模块的同名符号不会冲突
http://www.dtcms.com/a/191876.html

相关文章:

  • uniapp,小程序中实现文本“展开/收起“功能的最佳实践
  • SIP协议栈--osip源码梳理
  • 安装win11硬盘分区MBR还是GPT_装win11系统分区及安装教程
  • 鸿蒙OSUniApp制作动态筛选功能的列表组件(鸿蒙系统适配版)#三方框架 #Uniapp
  • 答题pk小程序道具卡的获取与应用
  • RabbitMQ 消息模式实战:从简单队列到复杂路由(二)
  • 产线视觉检测设备技术方案:基于EFISH-SCB-RK3588/SAIL-RK3588的国产化替代赛扬N100/N150全场景技术解析
  • Android Development Roadmap
  • 数学复习笔记 10
  • 华宇TAS应用中间件与亿信华辰多款软件产品完成兼容互认证
  • CSS图片垂直居中问题解决方案
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的“互相拆台”式宣传策略研究
  • 深入探索 OpenCV:从实时视频流到图像处理的实战指南
  • 《数字分身进化论:React Native与Flutter如何打造沉浸式虚拟形象编辑》
  • ubuntu系统 usb网卡rtl8852bu驱动安装
  • 第35周Zookkeeper+Dubbo JDK不同版本介绍
  • 开源的跨语言GUI元素理解8B大模型:AgentCPM-GUI
  • Tomcat多应用部署与静态资源路径问题全解指南
  • 深度解析IP静态的工作原理,IP静态的应用场景又哪些?
  • AWS EC2 微服务 金丝雀发布(Canary Release)方案
  • 攻击溯源技术体系:从理论架构到工程化实践的深度剖析
  • Pycharm IDEA加载大文件时报错:The file size exceeds configured limit
  • 微机控制非饱和土γ射线(CT)三轴试验系统
  • 国产化中间件 替换 nginx
  • 【NLP 74、最强提示词工程 Prompt Engineering 从理论到实战案例】
  • VSCode CMake工作流
  • Java引用类型
  • NSSCTF [GFCTF 2021]where_is_shell
  • 鸿蒙OSUniApp实现个性化的搜索框与搜索历史记录#三方框架 #Uniapp
  • digitalworld.local: DEVELOPMENT靶场