VS2019 C++20的module

  • 01 module一些资料
  • 02 vs2019中关于module的配置
    • 02.01 安装配置
    • 02.02 项目配置
  • 03 测试项目

01 module一些资料

对于大型项目,include头文件的方式会严重影响编译性能。比如类似chromium的开源项目。module是一个工程化特性,头文件中的信息现在分成导出的部分和不导出的部分,可以有效减少实现细节影响的范围,带来一个非常有用的特性——重新编译速度变快。

module是很早就被提及的概念,微软在vs2015中就开始部分支持,参考VS 2015 Update 1中C++Modules;在vs2017中的支持更进一步,参考在Visual Studio 2017 中使用C++ Modules。
参考资料:

  1. github上有代码,有文档较详细的资料
  2. cppreference.com的模块 (C++20 起):
  3. 在Visual Studio 2017中使用C ++模块
  4. 使用Visual Studio 2017 C++17模块(module)特性
  5. C++ 中的模块概述
  6. 模块,导入,导出

02 vs2019中关于module的配置

02.01 安装配置

vs2019 到2019年11月为止,只在实验功能中支持module。需要安装实验组件:
在vs2019的16.4.1中选择 [使用C++的桌面开发] 中的 [用于v142生产工具的C++模块(x64/x86-实验性)]
如下图所示:

02.02 项目配置

  1. 项目工程配置
    vs2019中不需要(像vs2017中那样)在C/C++命令行中配置/experimental:module /module:stdIfcDir "$(VCToolsInstallDir_150)ifc\$(PlatformTarget)
    如果项目中使用了module功能,只要再C/C++语言中配置如下两项即可:
    C++语言标准 = /std:c++latest
    启用C++模块(实验性) = /experimental:module
  2. 独立模块编译配置
    如果在项目中自己独立使用模块,需要使用命令行编译。而且如果在模块中引用了标准模块,需要在命令行中指定/module:stdIfcDir
    编译的相关命令行参数有:
    /experimental:module:启用C++模块属性
    /std:c++latest:C++语言标准
    /module:export:导出模块
    /module:stdIfcDir:指定标准库模块路径
    /MD|/MDd|/MT|/MTd:运行时库
    还要注意平台属性:即 x64|x86
    最后把这个汇总到一个bat文件中,把平台属性和运行时库做为bat文件的参数,配置到配置属性的生成事件–>生成前事件–>命令行里,如图
  3. 模块编译脚本样例
@echo offrem 这里要根据你编译的x86/x64;relase/debug选择对应目录下的cl.exe
rem set clcmd=D:\install\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\bin\Hostx64\x64\cl.exe
rem 在vs中自己会找到准确的cl.exe版本,不需要特别指定
set clcmd=cl.exerem 如果module中引用了标准库,需要指定/module:stdIfcDir
rem /experimental:module /module:stdIfcDir "$(VCToolsInstallDir_160)ifc\$(PlatformTarget)"
rem $(VCToolsInstallDir_160)=D:\install\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\
rem $(PlatformTarget)=x64
set target=%1%
if "%target%"=="" set target=x64
@echo %target%
rem 根据自己的实际目录设置
set stdIfcDir="D:\install\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\ifc\%target%"rem 指定代码生成的运行库md mdd mt mtd(动态库 动态调试库 静态库 静态调试库)
rem 本bat的第一个参数指定是否是debug版本,如果是debug版本,第一个参数是 d
set rundll=%2%
if "%rundll%"=="" set rundll=MDrem 显示运行时库参数
@echo %rundll%set CFLAGS=/experimental:module /std:c++latest /EHsc /%rundll% /c /module:stdIfcDir %stdIfcDir% /module:export rem cl.exe /experimental:module /std:c++latest /EHsc /MD /c /module:stdIfcDir "D:\install\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\ifc\x64" /module:export module01.cpp
"%clcmd%" %CFLAGS% module01.cpprem "%clcmd%" %CFLAGS% 模块文件
"%clcmd%" %CFLAGS% hello.mpp hello.cpp"%clcmd%" %CFLAGS% module02.cpp
  1. /module:stdIfcDir参数确定方式
    在项目属性的预处理器中的预处理器定义里查看$(VCToolsInstallDir_150)ifc\$(PlatformTarget)

03 测试项目

C++20的module在vs2019 16.4.1上面的测试

  1. module01.cpp
module module01;// 在模块中未使用基础库,极少数情况
// 编译时,可以不指定/module:stdIfcDir
namespace module01 {int test(int x){return x * x;}
}
  1. module02.cpp
module module02;// 在模块中未使用基础库,极少数情况
// 编译时,必须指定/module:stdIfcDir
import std.core;
using namespace std;namespace module02 {void say(const char* str) {cout << str << endl;}
}
  1. hello.mpp
#pragma once
// 模块接口单元(module interface unit),类似于头文件
export module hello;namespace hello {void say_hi();
}export namespace hello {void say_hello();void say_xz();
}
  1. hello.cpp
// 模块实现单元(module implementation unit)
module hello;
// 在模块中使用import标准模块,需要在编译语句中指定/module:stdIfcDir 参数
import std.core;
using namespace std;namespace hello {void say_hi() {cout << "hello hi!" << endl;}void say_hello() {cout << "hello world!" << endl;}void say_xz() {cout << "hello xz!" << endl;}
}
  1. module.cpp
import std.core; // 使用标准导入模块
import module01; // 导入自定义模块
import hello;
import module02;using namespace module01; // 使用自定义模块的命名空间// 使用标准导入模块(import std.core;)
void use_standard_import_module() {std::cout << "hello world! use_standard_import_module" << std::endl;
}int main(int argc, char** argv)
{use_standard_import_module();// 直接使用模块中的函数名std::cout << "module01::test(100) = " << test(100) << std::endl;hello::say_hello();hello::say_xz();hello::say_hi();module02::say("module02::say!");return 0;
}

运行结果:

这里只测试了 https://github.com/mutouyun/cncppcon2018-cppmodules/blob/master/About-Cpp-Modules.md 中介绍的2.1/2.2/2.3;2.4/2.5/2.6没有测试通过。
2.4 Module Partitions vs2019应该还不支持;
2.5 Global Module Fragment
2.6 Legacy Header Unit

c++20 module相关推荐

  1. C++20四大之一:module特性详解

    前言 C++20最大的特性是什么? --最大的特性是迄今为止没有哪一款编译器完全实现了所有特性. C++20标准早已封版,各大编译器也都已支持了C++20中的多数特性,但迄今为止(2021.7),尚未 ...

  2. 技术干货 | C++20 四大特性之一:Module 特性详解

    导读:C++20 标准早已封版,各大编译器也都已支持了 C++20 中的多数特性,但迄今为止(2021.7),尚未有哪一款编译器完整支持 C++20 中的所有特性.本文仅介绍 C++20 四大特性当中 ...

  3. C++20,说说 Module 那点事儿

    几天前,C++20 草案已经获得了标准委员会的全票通过,C++2a 草案讨论的几个重要内容,比如"概念(concept)"."范围库(Ranges Library)&qu ...

  4. android内核模块签名,android安装内核module,提示Required key not available

    最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样.这 ...

  5. android 安装内核module,提示Required key not available

    最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样.这 ...

  6. JavaScript Module Pattern

    Module Pattern是JavaScript里面最常见的编码模式. 匿名闭包是这个模式可以实现的前提,例如下面的代码: 1 (function() 2 { 3 function dosometh ...

  7. insmod安装内核module,提示Required key not available

    最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样.这 ...

  8. 把view或者div绘制 canvas ,导出图片功能实现完整源码附效果图(兼容H5和小程序)

    先看下效果图:(上面灰色块内的用div和CSS写出来的,然后绘制到canvas) 实现此功能需要使用到一个微信小程序的插件,插件官方文档地址: wxml-to-canvas | 微信开放文档 本博客代 ...

  9. 54 Node.js快速入门

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.Node开发概述 1.1 为什么要学习服务器端开发基础 能够与后端程序员更加紧密的配合 ...

最新文章

  1. 2021全年“遇冷”后,“电商节”该何去何从?
  2. 【学术相关】IEEE TBD, 这个Trans刚被SCI收录,预计首个IF4
  3. HoloLens开发手记-凝视 Gaze
  4. Linux fread函数例程,21.2.9 文件读写实例--实现cp命令
  5. C++,std::shared_future的使用
  6. [转]Google 发现的十大真理
  7. 【NVIDIA】 nvidia-smi查看GPU使用情况
  8. 测试相貌相似度的软件,快乐相似脸 - 测试你们之间的长相相似度
  9. 聊聊pert图的那些事儿~
  10. 基于控制的角度无人机集群——目标追踪
  11. Nginx 配置多个SSL域名指向不同端口
  12. 刻意练习:Python基础 -- Task07. 文件与文件系统
  13. mailgun_使用Mailgun API简化应用程序中的电子邮件
  14. 保研之路——上科大信息学院直硕夏令营
  15. 戴尔灵越系列服务器是什么,戴尔灵越系列哪个好-2021戴尔灵越系列型号选购推荐...
  16. android 拦截耳机按键,Android耳机监测以及耳机按键监测
  17. Java实现库存防超卖_高并发场景-订单库存防止超卖
  18. 六、Hystrix详解三:Hystrix的健康监测
  19. Vue 项目飞鸟头条后台管理系统
  20. Es Bucket聚合(桶聚合) Terms Aggregation与Significant Terms Aggregation

热门文章

  1. 计算机组成指令系统知识总结,【计算机组成原理】指令系统知识点总结
  2. Win10相机打开后显示灰色的原因(仅适用于联想笔记本)
  3. 1月第3周安全回顾:企业安全面临新威胁
  4. 知乎好物推荐,只能再做一年了?
  5. 编一个函数求n的阶乘;使用for语句和while语句求n的阶乘;关于简单阶乘的求和(C)
  6. unity之vr中自动行走
  7. OSPF —— OSPF协议分析(OSPF报文详解)
  8. 电子综合实践_韵律灯
  9. 什么是FPGA?这次终于弄清楚了 | CSDN创作打卡
  10. CSS写表格样式的两种基本方式