0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++20 modules入门

程序喵大人 来源:程序喵大人 2023-05-29 15:03 次阅读

以前一直有了解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中安装:

a0d7dea6-fc7f-11ed-90ce-dac502259ad0.png

其次在自己的项目中,需要把C++标准改为C++20或者C++latest:

a0eabf44-fc7f-11ed-90ce-dac502259ad0.png

还有一点,需要在VS中启用modules功能:

a0fe31d2-fc7f-11ed-90ce-dac502259ad0.png

这三项都配置后,你应该就可以成功使用modules功能了。

看下我的测试用例:

a106f9de-fc7f-11ed-90ce-dac502259ad0.png

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函数所在的测试文件:

a122e61c-fc7f-11ed-90ce-dac502259ad0.png

想要使用Example module中export出的功能,直接import Example即可,剩下的使用方式和以前类似。

介绍到这里,大家就可以在VS中写一个modules的Demo了。

动手去吧,不要成为学习高手,要成为实战高手。

更多内容在一个优质的C++学习圈里,来一起钻研C++和Rust吧。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    801

    浏览量

    41779
  • C++
    C++
    +关注

    关注

    22

    文章

    2114

    浏览量

    73932
  • 编译器
    +关注

    关注

    1

    文章

    1642

    浏览量

    49336
  • Modules
    +关注

    关注

    0

    文章

    10

    浏览量

    8016

原文标题:C++20 modules入门

文章出处:【微信号:程序喵大人,微信公众号:程序喵大人】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C++20新特性解析

    C++之父都说过,C++20C++语言的一次重大变革,引入了大量的新特性。
    发表于 10-08 09:07 2087次阅读

    在MSVC中怎么使用modules

    以前一直有了解C++20的新特性,但是因为编译器对此支持的比较少,所以很少实践。
    发表于 06-15 11:37 480次阅读
    在MSVC中怎么使用<b class='flag-5'>modules</b>?

    C语言基础入门(20) signed #编程入门 #C语言 #c语言入门到精通 #程序猿 #硬声创作季

    C语言编程语言c语言入门
    fly
    发布于 :2022年08月26日 07:16:57

    STM32CubeIDE不支持C++20语法吗?

    我正在使用 STM32CubeIDE 编写 C++ 代码。IDE 的版本是 1.11.0,它带有 arm-none-eabi-g++ 版本 10.3-2021.10。编译器具有一些 C++20 功能
    发表于 02-02 06:51

    C++ 入门自学教程

    C++ 入门自学教程从入门知识开始讲起,比较有利于初学者入门掌握,比较好懂,能够对C++有一个全面认识
    发表于 11-17 10:36 0次下载

    C语言入门教程

    很好的C语言入门教程,可以肯定的说这个教程只是为初学或入门者准备的
    发表于 01-22 14:46 7次下载

    51单片机c51语言入门教程C语言入门教程

    51单片机c51语言入门教程,C语言入门教程
    发表于 08-29 15:02 32次下载

    c语言入门书籍推荐

    本文主要介绍c语言入门书籍,首先讲解了C语言的优点,其次详细的推荐了几款适合C语言入门的书籍。
    的头像 发表于 04-13 09:52 5.6w次阅读

    编程入门先学什么?c++语言入门大神先带你入这个群感受一二

    C++经过多年发展,从C++98到C++03,再到C++11-》C++14-》C++17以及最新
    的头像 发表于 09-11 09:58 1942次阅读

    2020年底将正式发布C++20

    9月4日,C++ 20的国际标准草案投票结束,而且获得了全票通过。这意味着C++ 20已完成最终的技术审批,并已完成ISO投票,我们希望在完成最后一轮ISO编辑工作之后,2020年底将
    的头像 发表于 09-22 14:28 3116次阅读

    关于C++ 20协程最全面详解

    花了一两周的时间后,我想写写 C++20 协程的基本用法,因为 C++ 的协程让我感到很奇怪,写一个协程程序十分费劲。让我们抛去复杂的东西,来看看写一个 C++ 协程需要哪些东西。
    的头像 发表于 04-12 11:10 1.3w次阅读
    关于<b class='flag-5'>C</b>++ <b class='flag-5'>20</b>协程最全面详解

    现代C++20实战手册

    追其根源,C++ 为何如此受欢迎,除了它本身出色的性能,作为一种高级面向对象语言,适用领域极其广泛,小到嵌入式,大到分布式服务器,到处可以见到 C++ 的身影;另一个很重要的原因就是它“最近”不断发布具有有趣功能的新语言标准,也就是 C
    的头像 发表于 01-17 09:55 3234次阅读

    C++20 modules基础知识入门

    以前一直有了解C++20的新特性,但是因为编译器对此支持的比较少,所以很少实践。
    的头像 发表于 06-15 11:37 946次阅读
    <b class='flag-5'>C++20</b> <b class='flag-5'>modules</b>基础知识<b class='flag-5'>入门</b>

    C++98到C++26,经历了什么?

    上个月,C++26时间表发布,将会在“并发和并行性方面有重大改进”。而已经推出的C++ 23版本则沿袭了C++17的传统特征,完善了现有特性。但是,与C++ 98、
    的头像 发表于 08-09 16:01 1155次阅读
    从<b class='flag-5'>C</b>++98到<b class='flag-5'>C</b>++26,经历了什么?

    C++20无栈协程超轻量高性能异步库开发实战

    c++20出来有一段时间了。其中一大功能就是终于支持协程了(c++作为行业大哥大级别的语言,居然到C++20才开始支持协程,我也是无力吐槽了,让多少人等了多少年,等了多少青春)但千呼万唤他终于还是
    的头像 发表于 11-09 10:20 1524次阅读