这篇文章是作者 加布里埃尔·多斯雷斯 , 安德鲁·帕多 ,还有比利·奥尼尔
什么是新的?
Visual C++团队欣喜若狂地宣布,使用VisualStudio 2017,它大大提高了 Visual Studio中C++模块TS的实现 ,除了引入消费能力 通过模块接口实现C++标准库 . 这些标准库的模块接口,就像编译器对模块的支持一样,都是实验性的,并且将不断发展以跟踪标准化过程。
入门
Visual Studio 2017 RTM或更新版本中包含标准库模块支持。此功能当前是可选的,默认情况下处于关闭状态。在将来的版本中,默认情况下,它们将与标准库头一起安装。在安装或更新C++支持时,请选择此选项。
如果您已经安装了VS 2017,但没有安装标准库模块,那么很容易修复。只需重新运行安装程序即可修改安装选项。
测试您的安装
要验证是否已将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而不是命令行,可以按照以下步骤将项目配置为使用实验模块。
- 首先,打开要使用的项目的属性:
- 接下来,在配置属性-> C/C++ +>代码生成下,验证多线程调试DLL或多线程DLL(分别用于调试和发布)。这些是新项目的默认选项,因此如果您没有更改这些设置,一切都应该正常工作。
- 接下来,在配置属性-> C/C++>语言中,通过选择C++ 17或C++最新的草稿标准,确保C++ C++ 17的特性被启用。
- 最后,如果您使用的是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)"
.
现在构建和测试运行应该成功了,向您展示三位哲学家的名字。
模块导出语法更改
在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本身。如需建议,请告知我们 用户语音 . 谢谢您!