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

C++20中的模块

      大多数C++项目使用多个翻译单元(translation units),因此它们需要在这些单元之间共享声明和定义(share declarations and definitions)。headers的使用在这方面非常突出。模块(module)是一种language feature,用于在翻译单元之间共享声明和定义它们是某些headers用例的替代方案。在C++20中,引入了模块的概念,以提高编译过程的效率并提供更好的代码组织和封装。模块允许开发人员将他们的代码分成单独的组件,每个组件都有自己的接口和实现,并根据需要导入它们。模块减少了与头文件相关的缺点,从而减少了编译时间

      模块与命名空间正交(Modules are orthogonal to namespaces)。

      语法如下:

export(optional) module module-name module-partition(optional) attr(optional); // Module declaration. Declares that the current translation unit is a module unit
export declaration // Export declaration. Export all namespace-scope declarations in declaration
export { declaration-seq(optional) } // Export declaration. Export all namespace-scope declarations in declaration-seq
export(optional) import module-name attr(optional); // Import declaration. Import a module unit
export(optional) import module-partition attr(optional); // Import declaration. Import a module partition
export(optional) import header-name attr(optional); // Import declaration. Import a header unit
module; // Starts a global module fragment
module : private; // Starts a private module fragment

      1.Module declarations:

      翻译单元可以具有模块声明,在这种情况下,它被视为模块单元。如果提供了模块声明,则必须是翻译单元的第一个声明(全局模块片段(fragment)除外)。每个模块单元都与模块声明中提供的模块名称(以及可选的分区(partition))相关联。模块单元是包含模块声明的源文件

      模块名称由一个或多个用点分隔的标识符组成(例如:mymodule、mymodule.mysubmodule、mymodule2...)。点没有内在含义,但它们被非正式地用于表示层次结构。

      声明中包含关键字export的模块单元称为模块接口单元(例如vs2022中后缀为.ixx文件,只编译一次,被编译成二进制表示);所有其他模块单元称为模块实现单元(例如vs2022中后缀为.cppm文件)。

      对于每个命名模块,必须有一个不指定模块分区的模块接口单元;此模块单元称为主模块接口单元。其导出的内容将在导入相应的命名模块时可用。

      2.Exporting declarations and definitions:

      模块接口单元可以导出声明(包括定义),这些声明可以被其他翻译单元导入。要导出声明,需在其前面加上export关键字,或者将其放在导出块内。

      3.Importing modules and header units:

      模块通过导入声明导入

      给定命名模块的模块接口单元中导出的所有声明和定义都将使用导入声明在翻译单元中可用。

      导入声明可以在模块接口单元中导出。

      在模块单元中,所有导入声明必须分组在模块声明之后和所有其他声明之前(In module units, all import declarations must be grouped after the module declaration and before all other declarations)。

      #include不应在模块单元中使用(全局模块片段之外),因为所有包含的声明和定义都将被视为模块的一部分。

      头文件单元是从头文件合成的单独翻译单元(A header unit is a separate translation unit synthesized from a header)。导入头文件单元将使其所有定义和声明都可访问。预处理器宏也是可访问的(因为导入声明可被预处理器识别)。

      4.Global module fragment:

      模块单元可以用全局模块片段作为前缀,当无法导入headers时可以使用它来包含headers。

      如果模块单元具有全局模块片段,则其第一个声明必须是module;。然后,全局模块片段中只能出现预处理指令。然后,标准模块声明标记全局模块片段的结束和模块内容的开始。

      5.Private module fragment:

      主模块接口单元可以以私有模块片段作为后缀,这允许将模块表示为单个翻译单元,而无需使模块的所有内容都可以被导入器(importers)访问。

      私有模块片段结束模块接口单元中可以影响其他翻译单元行为的部分。如果模块单元包含私有模块片段,它将是其模块的唯一模块单元。  

      6.Module partitions:

      模块可以有模块分区单元。它们是模块声明中包含模块分区的模块单元,模块分区以冒号:开头,位于模块名称之后。

      一个模块分区恰好代表一个模块单元(两个模块单元不能指定同一个模块分区)。它们仅在命名模块内部可见(命名模块之外的翻译单元不能直接导入模块分区)。

      模块分区可以由同名命名模块的模块单元导入。

      模块分区中的所有定义和声明对于导入模块单元而言都是可见的,无论是否导出。

      模块分区可以是模块接口单元(当其模块声明具有导出时)。

      7.Module ownership:

      一般而言,如果声明出现在模块单元中的模块声明之后,则声明将附加到该模块。

      如果实体(entity)的声明附加到命名模块,则该实体只能在该模块中定义。此类实体的所有声明都必须附加到同一模块。

      vs2022配置支持C++20模块步骤:配置属性

      (1).常规 --> C++语言标准:选择"ISO C++20标准(/std:c++20)"

      (2).C/C++ --> 常规 --> 扫描源以查找模块依赖关系:选择"是"

      (3).C/C++ --> 语言 --> 启用实验性的C++标准库模块:选择"是(/exprimental:module)"

      测试工程如下图所示:

      模块接口单元math_operations.ixx内容如下:

export module math_operations;export namespace math_ {int add(int a, int b);int sub(int a, int b);int mul(int a, int b);int div(int a, int b);
}

      模块实现单元math_operations.cppm内容如下:

export module math_operations;//#include <iostream> // error
import <iostream>; // import declarationnamespace {void error() // NOT be visible{std::cerr << "Error: the divisor cannot be 0" << std::endl;}} // namespaceexport namespace math_ {int add(int a, int b) { return a + b; }int sub(int a, int b) { return a - b; }int mul(int a, int b) { return a * b; }int div(int a, int b){if (b == 0) {error();return 0;}return a / b;}
} // export namespace math_

      test_modules.cpp内容如下:

import math_operations; // import declaration
#include <iostream>
//import <iostream>; // okint main()
{constexpr int a{ 8 }, b{ 2 };std::cout << "add: " << math_::add(a, b)<< ", sub: " << math_::sub(a, b)<< ", mul: " << math_::mul(a, b)<< ", div: " << math_::div(a, b) << std::endl;std::cout << "div2: " << math_::div(a, 0) << std::endl;std::cout << "test finish" << std::endl;return 0;
}

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

相关文章:

C++20中的模块

大多数C项目使用多个翻译单元(translation units)&#xff0c;因此它们需要在这些单元之间共享声明和定义(share declarations and definitions)。headers的使用在这方面非常突出。模块(module)是一种language feature&#xff0c;用于在翻译单元之间共享声明和定义。它们是某些…...

Selenium与流行框架集成:pytest与Allure报告

Selenium与流行框架集成&#xff1a;pytest与Allure报告 在现代软件开发中&#xff0c;自动化测试是确保产品质量和快速迭代的关键。Selenium作为业界领先的Web自动化测试工具&#xff0c;其灵活性和强大的功能受到广泛认可。为了进一步提升测试效率和报告质量&#xff0c;本文…...

日撸Java三百行(day17:链队列)

目录 一、队列基础知识 1.队列的概念 2.队列的实现 二、代码实现 1.链队列创建 2.链队列遍历 3.入队 4.出队 5.数据测试 6.完整的程序代码 总结 一、队列基础知识 1.队列的概念 今天我们继续学习另一个常见的数据结构——队列。和栈一样&#xff0c;队列也是一种操…...

Android摄像头采集选Camera1还是Camera2?

Camera1还是Camera2&#xff1f; 好多开发者纠结&#xff0c;Android平台采集摄像头&#xff0c;到底是用Camera1还是Camera2&#xff1f;实际上&#xff0c;Camera1和Camera2分别对应相机API1和相机API2。Android 5.0开始&#xff0c;已经弃用了Camera API1&#xff0c;新平台…...

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…...

力扣315.计算右侧小于当前元素的个数

力扣315.计算右侧小于当前元素的个数 离散化 树状数组 const int N 100010;int tr[N],n;class Solution {public:vector<int> countSmaller(vector<int>& nums) {n nums.size();vector<int> tmp(nums);vector<int> res(n);memset(tr,0,sizeo…...

websocket,css动画和css-position、display、区别

一、websocket codereturn {// 用于存储 WebSocket 返回的状态数据statusList: [],},mounted() {this.setupWebSocket();this.startBlinking();},methods: {setupWebSocket() {// 创建 WebSocket 连接const socket = new WebSocket(ws://xxx.xxx:xxx/xxx);// WebSocket 连接成功…...

前端获取视频文件宽高信息和视频时长

安装 yarn add video-metadata-thumbnails | npm install video-metadata-thumbnails引入依赖包 import { getMetadata } from video-metadata-thumbnails使用 if (file.name.includes(mp4)) {if (file) {try {console.log(file)// 获取视频的元数据const metadata await …...

【区块链+医疗健康】基于区块链的药品类监管应用管理系统 | FISCO BCOS应用案例

退热类药品的购药信息及政企互动信息等各项数据的安全性、保密性、真实性&#xff0c;不仅影响着监管部门的科学监管、 有效监管&#xff0c;也影响着企业的经营安全、诚信口碑&#xff0c;是区域药品安全监管工作进展的直观体现。 江苏数予科技有限公司构建基于区块链的药品类…...

MySQL4多表查询 内连接

多表查询 数据准备 CREATE DATABASE db4; USE db4; -- 创建部门表 create table if not exists dept(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp(eid varchar(20) primary key , -- 员工编号…...

Java -数组

1.一维数组 1.1数组定义 public class Main {public static void main(String[] args) throws Exception {int[] a new int[10];float[] f new float[10];double[] d new double[10];char[] c new char[10];} } 1.2 初始化 public class Main {public static void main(S…...

.prettierrc.js 有什么用

.prettierrc.js 是 Prettier 代码格式化工具的配置文件。 1. 作用 Prettier 是一个用于统一代码风格的工具&#xff0c;它可以使代码更具可读性和一致性。.prettierrc.js 文件用于自定义 Prettier 的格式化规则。 通过配置 .prettierrc.js&#xff0c;团队中的开发者可以遵循…...

haproxy七层代理

一.haproxy的基本部署 1.RS上装nginx [rootwebserver1 ~]# dnf install nginx -y 2.再RS上写入测试信息 [rootwebserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html [rootwebserver1 ~]# systemctl enable --now nginx [rootwebserver…...

<数据集>柑橘缺陷识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1290张 标注数量(xml文件个数)&#xff1a;1290 标注数量(txt文件个数)&#xff1a;1290 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Orange-Green-Black-Spot, Orange-Black-Spot, Orange-Canker, Orange…...

Go开发后端和Vue3开发前端的前后端分离框架中自己手戳一个OA流程审批、工作流引擎给新时代一个漂亮便捷的工作流引擎

前言 在软件项目开发中&#xff0c;我们都会接触到流程审批的需要业务&#xff0c;我们以往用的最多就是如下图这种流程编辑引擎插件&#xff1a; 以上截图中的流程工具是不是大家常见的呀&#xff01;感觉很丑拿不出手呀&#xff01;在当前行业内卷及竞争激烈情况下&#xff…...

深入理解 toDto 与 toEntity:结合 Eladmin 框架的最佳实践

在现代软件开发中&#xff0c;尤其是后端开发中&#xff0c;数据传输对象&#xff08;DTO&#xff09;和实体对象的转换是一个常见且重要的操作。理解和正确实现这种转换不仅能提高代码的可维护性&#xff0c;还能提升应用的性能和安全性。本文将深入探讨 toDto 和 toEntity 方…...

基于区块链的供应链应用开发

区块链的供应链溯源应用开发 一 、环境准备 (1)更新镜像源 apt update(2)安装(openssl、jdk、git) apt -y install openssl default-jdk git(3)配置JAVA_HOME环境变量 echo “export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/” >> /etc/profilesource /etc…...

获取GORM执行时的sql字符串

示例&#xff1a; import "log" func GetDetail(tx *gorm.DB,id int)(data any,err error){var query tx.Session(&gorm.Session{DryRun: true})err query.Where("id ?", id).First(&res).Errorif err!nil{zap.L().Error("get detail er…...

Linux系统使用Docker安装RStudio服务并实现任意浏览器远程访问

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…...

【原创】springboot+mysql法律咨询网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…...

【Git 内部原理】`.git` 是怎么记住所有版本的

​ 每次 git commit&#xff0c;Git 都说"已记录"。但你有没有想过&#xff1a;改了几十次、几百次&#xff0c;Git 是怎么全记住的&#xff1f;难道每次提交&#xff0c;它都复制一份完整项目&#xff1f; ​ 这篇文章不讲命令&#xff0c;也不背概念。 我们直接打开…...

Mochi Diffusion:如何在Mac上实现本地AI图像生成?完整技术指南

Mochi Diffusion&#xff1a;如何在Mac上实现本地AI图像生成&#xff1f;完整技术指南 【免费下载链接】MochiDiffusion Run Stable Diffusion on Mac natively 项目地址: https://gitcode.com/gh_mirrors/mo/MochiDiffusion Mochi Diffusion是一款专为Apple Silicon芯片…...

如何通过Outfit字体打造专业级视觉体验?设计师必备指南

如何通过Outfit字体打造专业级视觉体验&#xff1f;设计师必备指南 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts 在数字化设计领域&#xff0c;字体不仅是信息传递的载体&#xff0c;更是品牌个…...

立创泰山派RK3566开发板串口调试:从1500000到115200的保姆级修改指南

立创泰山派RK3566开发板串口调试&#xff1a;从1500000到115200的保姆级修改指南 刚拿到立创泰山派RK3566开发板时&#xff0c;很多开发者都会遇到一个令人头疼的问题——默认的串口波特率高达1500000bps&#xff0c;而市面上大多数串口调试工具根本不支持这个速率。这就像拿到…...

从零开始:Qwen3-ASR-1.7B环境搭建与Web服务启动教程

从零开始&#xff1a;Qwen3-ASR-1.7B环境搭建与Web服务启动教程 1. 环境准备与快速部署 1.1 硬件要求检查 在开始部署Qwen3-ASR-1.7B之前&#xff0c;请确保您的服务器满足以下最低硬件要求&#xff1a; GPU显存&#xff1a;≥6GB&#xff08;推荐RTX 3060及以上&#xff0…...

一条命令部署OpenClaw?PPClaw的便利背后,先看清这些代价

先说结论PPClaw确实能大幅降低OpenClaw的初始部署门槛&#xff0c;尤其适合快速验证场景&#xff0c;但长期使用需考虑云端成本和控制权问题。工具的核心价值在于抽象了服务器运维和模型配置&#xff0c;但模型切换、自定义集成仍有一定学习成本&#xff0c;并非完全“零配置”…...

LeetCode 热题100(JAVA)

LeetCode 热题100&#xff08;JAVA&#xff09; 哈希 1. 两数之和 给定一个整数数组 nums和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c; 并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不…...

DeEAR效果对比展示:不同语速/音量/口音语音在三情感维度上的识别稳定性验证

DeEAR效果对比展示&#xff1a;不同语速/音量/口音语音在三情感维度上的识别稳定性验证 1. 引言&#xff1a;语音情感识别的实际价值 想象一下&#xff0c;当你接到客服电话时&#xff0c;系统能准确识别你的情绪状态&#xff1b;当孩子上网课时&#xff0c;老师能实时了解学…...

给嵌入式新人的第一课:用CubeMX和HAL库,5分钟搞定STM32F407ZGT6的LED灯

给嵌入式新人的第一课&#xff1a;用CubeMX和HAL库&#xff0c;5分钟搞定STM32F407ZGT6的LED灯 当你第一次听说"嵌入式开发"时&#xff0c;脑海中浮现的可能是密密麻麻的电路板和复杂的寄存器配置。但今天我要告诉你一个秘密&#xff1a;现代嵌入式开发已经变得像在V…...

Ostrakon-VL模型压缩与量化实战:在消费级GPU上的部署优化

Ostrakon-VL模型压缩与量化实战&#xff1a;在消费级GPU上的部署优化 1. 为什么需要模型压缩与量化 当你第一次尝试在消费级GPU上运行Ostrakon-VL这样的视觉语言大模型时&#xff0c;可能会遇到显存不足或推理速度过慢的问题。这就像试图用家用轿车运送重型建筑材料——虽然理…...