C++20 modules入门

以前一直有了解c++20的新特性,但是因为编译器对此支持的比较少,所以很少实践。
近期我才知道msvc已经全面支持了c++20的新特性,所以打算全部实践一下,最近在msvc上跑通了modules,这里分享一下modules的使用方法(注意,以下case仅适用于msvc上,估计其它编译器的使用方式与此有些差异)。
那modules是什么?它有什么作用?
以前c++中想使用外部某个函数或变量需要使用#include来引用头文件,但include这种做法其实就是把文件的内容原封不动的复制过来,如果一个复杂的头文件被好多个源文件include,那整个项目的编译速度也会降低,而且很多时候也会把一些复杂的宏定义引入进来,造成宏污染等等。
而modules就是为了解决这种问题而引入的,它是一种组件思想,一个module编译一次后,它的结果会被保存在二进制文件中,一个module可以选择把什么内容暴露给外面使用,剩下的只有内部可见。其它想使用此module的模块直接使用即可,无需再次编译,可以重用。最主要的是,使用modules的项目,编译速度比include的方式快的多,记得之前看过一组测试数据(好像是哪个会议上c++之父贴出来的),modules项目的编译速度是include的25倍左右。
如果你的项目中已经使用了c++20,真的可以考虑把include方式转换为modules方式。
在msvc中怎么使用modules?
我的编译器是vs2019,经我测试,想要vs中跑通modules需要一些前置条件,比如需要安装modules相关的环境包,可以在vs installer中安装:
其次在自己的项目中,需要把c++标准改为c++20或者c++latest:
还有一点,需要在vs中启用modules功能:
这三项都配置后,你应该就可以成功使用modules功能了。
看下我的测试用例:
example.ixx可以理解为是头文件,它定义了可以对外暴露的接口,后缀名是.ixx,开头以export module name表示该module的名字是name。
前面加了export的修饰的函数或类表示可以对外暴露,外部可以使用。而module :private; 后面的表示内部的东西,只有内部可见和使用,外部不能使用,比如example.ixx中的privatefunc,如果外部使用,编译时就会报错。
模块接口文件的后缀名一般是.ixx,实现接口的文件后缀名和原来的c++一样,还是.cpp。
看我的example.cpp,第一行中的module example,表示在module example空间,自然而然可以访问到example module中的内容,这里你也可以看的到,里面定义了ixx中声明的接口。
那import std.core; 是什么作用?
import表示导入xxx模块,import后就可以使用对应模块的功能,比如想要使用std::cout,那就需要import std.core。
那我们以前使用的那些标准库的函数,都对应什么module?
在msvc中是这样:
std.regex提供头文件的内容
std.filesystem提供头文件的内容
std.memory提供头文件的内容
std.threading提供了头文件、、、、和的内容
除此之外的功能都由std.core提供。
要使用某些模块,直接添加import声明即可:
import std.filesystem;import std.core;  
再看下我的main函数所在的测试文件:
想要使用example module中export出的功能,直接import example即可,剩下的使用方式和以前类似。
介绍到这里,大家就可以在vs中写一个modules的demo了。
动手去吧,不要成为学习高手,要成为实战高手。
更多内容在 一个优质的c++学习圈 里,来一起钻研c++和rust吧。


5G LAN是什么?5G LAN商用实现工业物联网5G无线接入
老祖宗说过落后就要被群殴 这次为了人工智能革命也一定要挺百度
中国移动杨杰:打造“5G+”产业联盟生态,促进在5G新时代精彩绽放
巴西态度二次反转,华为5G出现转机
小米平板3评测:升级太少 性价比优势不再明显
C++20 modules入门
机器人领域专题报告:人形机器人市场空间有多大?
物联网生态提升盈利能力,疫苗网全国落地500余触点
手机flash芯片品牌有哪些_七大flash芯片品牌排名
FPGA有符号数,定点小数表示及计算机数值表示规则
织物涨破仪是什么,它的使用方法是怎样的
从一单难求到寒气逼人 大陆半导体核心产业链逐步规模化
电子标签在智能物流中的作用分析
随着新能源车辆的推广 动力电池的技术越来越重要
2020深圳慕展同期5G时代下的工业物联网
Ceitec执行长:三年内巴西将有“台积电级”晶圆厂
IGBT在中频感应加热电源中的应用
如何编写出质量较高的PLC程序
WT2003H语音芯片在空气质量监测系统的应用方案
iPhone13将减产1000万部