在Visual Studio 2017中使用C++模块

点这里看中文版

null

这篇文章是作者 加布里埃尔·多斯雷斯 , 安德鲁·帕多 ,还有比利·奥尼尔

什么是新的?

Visual C++团队欣喜若狂地宣布,使用VisualStudio 2017,它大大提高了 Visual Studio中C++模块TS的实现 ,除了引入消费能力 通过模块接口实现C++标准库 .  这些标准库的模块接口,就像编译器对模块的支持一样,都是实验性的,并且将不断发展以跟踪标准化过程。

入门

Visual Studio 2017 RTM或更新版本中包含标准库模块支持。此功能当前是可选的,默认情况下处于关闭状态。在将来的版本中,默认情况下,它们将与标准库头一起安装。在安装或更新C++支持时,请选择此选项。

Install Standard Library Modules

如果您已经安装了VS 2017,但没有安装标准库模块,那么很容易修复。只需重新运行安装程序即可修改安装选项。

Rerun VS Installer

测试您的安装

要验证是否已将VS2017设置为利用标准库模块,请编译并运行此简单程序(例如在文件中) test-vs2017-slm.cxx )从开发人员命令提示符。由于该特性仍然是实验性的,所以目前VSIDE中很少有对模块的内置支持。

import std.core;  int main() {     using namespace std;     vector<string> v { "Plato", "Descartes", "Bacon" };     copy(v.begin(), v.end(), ostream_iterator<string>(cout, "")); } 

用命令

cl /experimental:module /EHsc /MD /std:c++latest test-vs2017-slm.cxx 

它应该毫不费力地生成一个可执行文件( test-vs2017-slm.exe )当被处决时,柏拉图,笛卡尔,培根各印一行。

使用标准库模块的编译器开关

您需要添加编译器开关 /MD 编译使用标准库模块的源文件时。 这个 /MD switch为CRT引入了动态库 . 在调试版本中,您需要使用 /MDd 而不是 /MD .

如果你忘了说明 /MD (或 /MDd 对于调试版本),您将从链接器收到警告,并最终导致链接器错误 LNK2019 表示未解析的外部符号。

无需其他选项即可利用标准库模块支持。提供的标准库模块仅用于UCRT的DLL导入库。

从VSIDE使用标准库模块

如果要使用IDE而不是命令行,可以按照以下步骤将项目配置为使用实验模块。

  1. 首先,打开要使用的项目的属性: Open Project Properties
  2. 接下来,在配置属性-> C/C++ +>代码生成下,验证多线程调试DLL或多线程DLL(分别用于调试和发布)。这些是新项目的默认选项,因此如果您没有更改这些设置,一切都应该正常工作。 Use dynamic libraries
  3. 接下来,在配置属性-> C/C++>语言中,通过选择C++ 17或C++最新的草稿标准,确保C++ C++ 17的特性被启用。 Use latest draft standard
  4. 最后,如果您使用的是Visual Studio 2017 15.3之前的版本,请添加 /experimental:module /module:stdIfcDir "$(VCToolsInstallDir_150)ifc$(PlatformTarget)" 配置属性-> C/C++ + >命令行,打开该项目的模块。请注意,在VS 2017的后续更新中不需要此步骤:VS IDE提供标准库模块文件的位置(即 /module:stdIfcDir 参数)当您选择启用C++模块时。另外,如果你用的是 来自夜间NuGet包的编译器 我们做了一些修复,所以您应该将命令行设置为 /experimental:module /module:stdIfcDir "$(VC_IFCPath)" . Modules configuration properties

现在构建和测试运行应该成功了,向您展示三位哲学家的名字。

Running modules test

模块导出语法更改

在2016年11月的C++标准会议上,C++标准委员会更改了导出模块的语法(见 模块问题1 )从

export module Bank;

export import Bank;

除了允许旧语法带有警告之外,VisualC++的这个版本实现了该解决方案。C++委员会正在考虑重新使用旧的语法,并有不相容的含义。  我们鼓励你转换成新的语法;支持旧语法将停止执行由ISO C++标准委员会修订的模块TS草案。

标准库模块(实验)

VS2017 RTM发布的一个关键新奇是通过模块消费C++标准库的支持。  这是一个实验特性,并在C++建议中描述。 标准库模块 . 在此版本中,模块的组织方式如下:

  • std.regex 提供标题的内容 <regex>
  • std.filesystem 提供标题的内容 <experimental/filesystem>
  • std.memory 提供标题的内容 <memory>
  • std.threading 证明标题的内容 <atomic> , <condition_variable> , <future> , <mutex> , <shared_mutex> , <thread>
  • std.core 提供C++标准库中的所有其他内容

要在程序中使用这些模块中的任何一个,只需编写 import M ; 在源文件的顶层,其中 M 是上面列出的任何模块。看到了吗 测试示例 .

如果要对标准库标头以外的标头使用模块,则标准库模块将使用 /module:export 中描述的开关 初始C++模块博客帖子 ; 具有 /module:export . 如果您有其他依赖的库,并且希望尝试完全无头的体验,那么您可以用相同的方式打包这些其他头。

未来的版本将更紧密地跟踪标准库模块的提议。

行动号召

现在下载VisualStudio 2017,并尝试C++项目和程序中的模块。  你可以从全部替换开始 #include 容器的标准头和算法 import std.core; 并添加编译器开关 /experimental:module /MD /MDd (如果您是作为debug构建)到您的构建定义。  让我们知道你的经历。

最后

一如既往,我们欢迎您的反馈。欢迎通过电子邮件发送任何评论 visualcpp@microsoft.com ,通过 推特@visualc ,或Facebook Microsoft Visual Cpp .

如果您在VS 2017遇到MSVC的其他问题,请通过 报告问题 选项,从安装程序或VisualStudioIDE本身。如需建议,请告知我们 用户语音 . 谢谢您!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享