C++ 20新特性之模块

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

为什么要引入模块

        在C++ 20之前,所有的代码组织都依赖于预处理器和头文件。这种方式主要存在以下四个问题:一是大型项目中,相同的头文件会被多次包含,导致编译时间延长;二是头文件之间复杂的相互引用关系难以管理,容易造成编译时错误;三是全局命名空间污染,不同的库可能定义相同的名字,导致冲突;四是修改一个头文件往往需要重新编译所有依赖它的源文件。

        模块的引入,正是为了克服上述问题,从而提供一种更现代、更高效的代码组织方式。

模块的基本概念

        在C++ 20中,模块是一种新的编译单元,称为模块单元(Module Unit)。模块允许我们将相关的代码组织在一个单独的文件中,这个文件可以是源文件(.cpp)或模块接口单元(.ixx或.cppm)。模块接口单元声明了模块中可供外部使用的实体(比如:类、函数、变量等),并且可以选择性地定义这些实体。

        模块分为两个部分:模块接口和模块实现。

        模块接口文件通常以.cppm(或.ixx)为扩展名,它定义了模块对外提供的接口。接口文件可以不包含任何实现代码,只负责声明,也可以提供具体的实现。

        模块实现文件则是.cpp文件,包含了模块的具体实现细节,它通过导入对应的模块接口文件来访问接口声明。

定义模块

        假如我们要创建一个名为math的模块,它提供了一些基础的数学函数。首先,我们创建模块接口文件math.cppm,示例代码如下。

export module math;export double square(double x);export double cube(double x);

        在上面的示例代码中,export module math声明了模块的名字为math。export关键字则用来指示哪些函数或类型是模块的公共接口,可以被外部访问。

        接下来,如果有具体的实现逻辑,我们可以在math_impl.cpp中实现。

module math;// 实现细节可以放在这里
double square(double x)
{return x * x;
}double cube(double x)
{return x * x * x;
}

        另外,大型模块可以被分割成多个分区,每个分区有自己的接口和实现。比如:math模块可以分为algebra和geometry两个分区。

// math/algebra.cppm
export module math.algebra;
export double multiply(double a, double b);// math/geometry.cppm
export module math.geometry;
export struct Point { double x, y; };

导入模块

        在另一个源文件中,我们可以像下面的示例代码这样导入并使用math模块。

import math;int main()
{double result = square(5.0);result = cube(3.0);return 0;
}

        注意:模块的编译与传统方式有所不同。模块接口文件首先被编译成模块接口单元(.ifc或特定格式的二进制文件),这个过程类似于将源代码编译成对象文件。然后,模块实现文件和使用这些模块的源文件被编译时,会直接链接这些预先编译好的接口单元,而不是再次处理头文件,大幅减少了编译时间。

总结

        C++ 20的模块特性为C++编程带来了许多优势,包括:提高编译效率、减少头文件冗余、避免标识符冲突等。随着编译器对模块特性的支持不断完善和普及,模块将会成为C++编程中不可或缺的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来了,你的第一个AI智能体

为了能直观的感受AI智能体,最好的方法是亲手开发一个智能体,当然,这个智能体不能太复杂,否则难度太大,会打击我们的热情的,热情是很宝贵的资源,必须要小心呵护。 我们在国内AI平台语聚AI上搭建…

Batch入门教程

Batch学习在多个领域有不同的应用,但最常见的是在机器学习和教育学习领域。以下是一个关于Batch学习入门的清晰指南,将分别介绍这两个领域中的Batch学习概念、方法和一些实用信息。 1. 机器学习中的Batch学习 定义与概念 Batch_Size:在机器…

RK3588 Android13 TvSetting 中增加 WebView 切换菜单

前言 电视产品,客户要求在设置中设备偏好设置子菜单下增加一个 WebView切换菜单,一开始不知道怎么下手,后来想起来在设置开发者选项里有一个类似的菜单, 去把实现逻辑搞出来应该就ok。 效果图 TvSetting 部分修改文件清单 packages/apps/TvSettings/Settings/res/values…

【吊打面试官系列-Mysql面试题】为表中得字段选择合适得数据类型

大家好,我是锋哥。今天分享关于 【为表中得字段选择合适得数据类型】面试题,希望对大家有帮助; 为表中得字段选择合适得数据类型 字段类型优先级: 整形>date,time>enum,char>varchar>blob,text 优先考虑数字类型,其次…

npm-check【实用教程】升级项目中的依赖

安装 npm-check npm i -g npm-check检查项目中的依赖 npm-check会显示项目中没有使用,以及有新版本的依赖 升级项目中的依赖 npm-check -u方向键上下可以移动图中左侧的箭头空格键可选中/取消选中标注为 Major Update 和 Non-semver 类的版本,需去官网查…

Python课程设计:python制作俄罗斯方块小游戏

基于python的俄罗斯方块小游戏 目录 基于python的俄罗斯方块小游戏 1.概述 1.1 摘要 1.2 开发背景 1.3 开发环境 1.4 实现功能 2.代码描述 2.1 模块导入 2.2 初始化变量 2.3 播放音乐 2.4 创建方块类 2.5 绘制游戏地图 2.6 游戏初始化 2.7 绘制有边框矩形 2.8 …

Curator框架的底层原理

Curator框架的底层原理主要围绕以下几个核心方面: 1. **异步操作**:Curator框架通过异步操作来提高性能和可扩展性。它使用Future、Callback或Watcher模式,允许在适当的时机返回结果或通知应用程序状态的变化。 2. **错误处理**&#xff1a…

【小沐学AI】Python实现语音识别(Whisper-Web)

文章目录 1、简介2、下载2.1 openai-whisper2.2 whisper-web 结语 1、简介 https://openai.com/index/whisper/ Whisper 是一种自动语音识别 (ASR) 系统,经过 680,000 小时的多语言和多任务监督数据的训练,从网络上收集。我们表…

VLAN的工作原理、划分方式、配置示例

随着网络技术的飞速发展,VLAN(Virtual Local Area Network,虚拟局域网)技术已成为网络分割和管理的重要工具。它不仅能提升网络的安全性和效率,还极大地增强了网络管理的灵活性。 VLAN概述 VLAN,即虚拟局…

ASPICE与ISO 26262在汽车行业中的协同关系

ASPICE(Automotive Software Process Improvement and Capability dEtermination)与ISO 26262之间的关系主要体现在以下几个方面: 1.目标和关注点: ASPICE:是一种软件和系统开发过程的评估和改进框架,专注…

Web前端第四次作业

目录 一、编写一个函数,形参是一个数组,返回数组中所有数字的平均值 二、编写一个函数,形参是一个数组,返回数组中的最大值 三、编写一个函数,形参是一个字符串,统计该字符串中每个字母出现的次数&#…

大数据之路 读书笔记 Day1

大数据之路 读书笔记 Day1 阿里巴巴大数据系统体系架构图 1. 数据采集层 #mermaid-svg-YqqD2w3qV6jc2aGP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YqqD2w3qV6jc2aGP .error-icon{fill:#552222;}#mermaid-sv…

2024.6.26 待学习知识点

" 取工单的组件 lt_aufnr CORRESPONDING #( lt_out MAPPING aufnr aufnr EXCEPT * ).ABAP POPUP_TO_CONFIRM 弹出框函数 CLASS-EVENTS CLASS-METHODS main. CLASS-METHODS raise_event_EXIT_COMMAND IMPORTING iv_ucomm TYPE sy-ucomm. PUBLIC SECTION. PROTECTED SE…

春风得意特斯拉(二)

科技品牌的命名也讲究独具特色和鲜明的辨识度,特斯拉为了致敬和纪念著名的物理学家尼古拉斯特斯拉,命名本身就具有先进性和领先性,而且是超越时代的领先性。如果缺乏时代高度和创造力,难以支撑品牌的市场地位。科技品牌命名简洁化…

一文看懂C++中的数字处理

在C编程中,数字处理是非常基础且重要的部分。C提供了多种数据类型和丰富的数学运算能力,使得开发者可以方便地进行各种数值计算。本文将介绍C中的基本数据类型、数字运算以及常用的数学函数,帮助读者更好地理解和应用C中的数字处理功能。 一…

中文检测程序(静态代码扫描)

欢迎您关注我们,经常分享有关Android出海,iOS出海,App市场政策实时更新,互金市场投放策略,最新互金新闻资讯等文章,期待与您共航世界之海。 在前些日子,给大家安利了我们在用的AS中文实时检测插…

聚类距离度量(保姆级讲解,包学会~)

在机器学习的聚类中,我们通常需要使用距离来进行类的划分,或者比较不同类之间的各种距离,这里我们介绍西瓜书上所提出的一些距离计算方式。 首先介绍一下距离的一些性质: 西瓜书上给出了四条性质,第一个是非负性&#…

使用命令行创建uniapp+TS项目,使用vscode编辑器

一:如果没有pnpm,先安装pnpm 二:使用npx工具和degit工具从 GitHub 上的 dcloudio/uni-preset-vue 仓库克隆一个名为 vite-ts 的分支,到项目中. 执行完上面命令后,去manifest.json添加appid(自己微信小程序的Id),也可不执行直接下一步,执行pnpm install ,再执行pnpm:dev:mp-weix…

Mysql索引的实现原理,B+Tree,WAL

InnoDB 引擎,每一个数据表有两个文件 .frm和.ibd,分别为表结构,数据和索引,数据挂在主索引的叶子节点上,此主索引称为聚簇索引。 MyISAM 引擎,每一个数据表有三个文件.frm和.MYI和.MYD,分别为表…

恋爱脑?No,爱情保镖还得靠AI!

本文由 ChatMoney团队出品 你是否曾经想过,为什么我们会在恋爱中变得如此“上头”,仿佛整个世界都围绕着那个TA旋转? 恋爱脑,通常是指一个人在恋爱中过度投入、过度依赖对方,甚至无法自拔的心理状态。 你会发现自己时时刻刻都在…