在Visual Studio 2017 中使用C++ Modules

[原文发表地址] Using C++ Modules in Visual Studio 2017

[原文作者] Gabriel Dos Reis, Andrew Pardoe, Billy O’Neal

[原文发表时间] 2017/5/5

新的东西是什么?

Visual C++ 团队很高兴的宣布C++ Modules的特性在Visual Studio 2017 中得到了很大的提升。此外还引进使用C++标准库Modules的接口功能。这些标准库接口,就像编译器支持Modules一样,还是试验性的,最终将会演变到标准进程中。

入门

在Visual Studio 2017 RTM或更高版本中才支持标准库的Modules。此功能目前是可选的,默认情况下是关闭的。在将来的版本中,将会和标准头文件一样被默认安装。当你安装或者更新C++功能支持时只需要选择下边的选项。

如果你已经安装了VS2017但没有安装标准库的Modules。这很容易就解决了。只需要重新运行安装程序来更改你的安装选项。

 

测试安装

为了验证在VS 2017中你是否正确的安装且可以使用标准库的Modules,请在命令行编译运行这个简单的程序(保存在test-vs2017-slm.cxx)。由于这部分功能还是实验性的,所以目前VS IDE对Modules 的支持非常有限。

import std.core;

int main()

{

using namespace std;

vector<string> v { "Plato", "Descartes", "Bacon" };

copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));

}

用如下命令编译:

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

这很容易就生成可执行文件(test-vs2017-slm.exe),执行它的时候就会依次输出Plato, Descartes, 和Bacon并且换行。

使用标准库Modules的编译器开关

当你编译一个包含标准库Modules的源文件的时候,你需要添加编译器开关/MD。这个开关将打开C++运行时的动态库。在Debug模式下生成的话则需要用/MDd替换/MD。 如果忘记添加/MD(或者Debug模式下的/MDd),你会得到一个链接错误LNK2019。 不需要其他的编译选项来使用标准库Modules。标准库Modules只和通用运行时的动态链接库一起使用。

使用来自VS IDE中的标准库Modules

如果你想使用IDE代替命令行,你可以根具以下步骤配置你的工程去使用试验中的Modules部分。

  1. 打开工程属性
  2. 依次选择配置属性 -> C/C++ -> 代码生成。确保/MD被设置。这些都是默认的设置,所以你不用做任何更改。
  3. 在配置 –> C/C++ -> 语言设置你需要的配置,确保C++17所有的功能可用。
  4. 最后添加add /experimental:module /module:stdIfcDir"$(VCToolsInstallDir_150)ifc\$(PlatformTarget)" 到配置属性 -> C/C++ ->命令行去为此工程开启Modules功能。注意在将来的VS2017版本中这一步就不需要了,VS IDE将会默认提供标准库Modules文件的位置(/module:stdIfcDir 这个参数)。

完成以上步骤,生成和测试应该就能成功运行了,如下,会显示三位哲学家的名字。

Module 输出语法的更改

在2016年11月C++标准大会上,C++标准委员会将Module的输出语法从“export module Bank; ”更改为“export import Bank;”。 当前版本的Visual C++已经实现了这个方案,而且以前的语法会报一个警告。C++委员会正在考虑如果再使用旧的语法是一种不兼容的行为。我们鼓励你们使用新的语法,因为C++标准委员会将会废弃旧的语法来提升Modules的性能。

标准库Modules(实验性的)

一个新的特性实施在了VS2017 RTM上,那就是对C++标准库Modules的使用。这是一个还在测试中的功能,也在C++标准库Modules提案中有提到。在此次版本中,Modules包含以下部分:

  • std.regex包含了<regex>的所有内容。
  • std.filesystem包含了<experimental/filesystem>的所有内容。
  • std.memory包含了<memory>的所有内容。
  • std.threading包含了<atomic>, <condition_variable>, <future>, <mutex>, <shared_mutex>, <thread>的所有内容。
  • std.core包含了所有的C++标准库。

如果需要使用这些Modules在你的程序中,只需在原文件最上方写入”import M;” M包含以上的任何Modules。看这个例子

如果你需要使用包含头文件的Module而不是标准库头文件,使用/module:export开关(最初的C++ Modules博客)。如果你还有其他依赖的库,并且想要尝试完全不使用头文件的体验,你可以用相同的方式来打包这些头文件。

将来的版本将会更紧密去跟踪标准库Modules的提案。

呼吁

下载Visual Studio 2017,从今天开始在你的程序中尝试使用C++ Modules。你可以开始替换所有#include的头文件,用std.core替换所有算法库。在你的源文件中添加编译器开关/experimental:module 和/MD 或者/MDd(如果你在Debug模式下生成的话使用此开关)。请让我们知道你的体验。

结束语

一如既往,我们欢迎你们的反馈,请发送你的任何问题到visualcpp@microsoft.com,也可以通推特@visualc,或者在Microsoft Visual Cpp的脸书下留言。

如果你在VS2017中遇到了其他的问题,也请报告你的问题给我们,也可以通过安装程序或者IDE界面反馈。对于你们的建议,也让我们听到你们的心声。在这里感谢每一个人。