编译器中的标准开关版本

[原文发表地址] Standards version switches in the compiler

[原文发表时间] 2016/6/7

这篇博客由Gabriel Dos Reis, Ulzii Luvsanbat, 和Andrew Pardoe共同完成。

Visual C++2015 Update3 中引进了一个工具, 它可以帮助你控制你所依赖的ISO C++程序设计语言版本和强制在工程里使用你想要的VC++版本。我们创建了一系列编译开关用于控制C++语言的版本,从/std:c++14/std:c++latest开始。

为什么增加这些编译开关?

传统意义上,我们发布的编译器在默认模式下,可以兼容多个版本的C++语言,例如:C++98, C++03, C++11, C++14等, 除了改进一致性相关bug修复之外。这可能会导致很难同时更新到较新,较高级的编译器,与此同时,也比较难向前兼容代码。我们非常感谢你在我们提高一致性和新功能方面给的大量反馈。C++标准委员会正在筹备新的C++版本,我们已经采取主动以帮助你声明build系统或者编译器命令行。(在升级为下一个Visual C++版本时, 哪一个版本的C++你最满意。)

在第一个发布Visual studio 2015 和Visual studio 2015 Update 3 之间,Visual C++在标准一致性方面取得了巨大的进步。我们修复了很多问题,如constexpr, improved expression SFINAE support, evaluation of initializer lists, variable templates, 等等。我们的标准库一直紧跟着新功能的步伐,现已开始实施post-C++14 标准草案。我们已经实现了正被被委员会审议的标准中很多主要功能,包括C++模块协调程序。我们希望你从中受益,但是我们也希望你在更新到新版本时,根据自己的节奏来使用这些新功能。

在这个update版本中,所有的post-C++14功能已实施,在默认情况下是关闭的;为避免build崩溃,以前版本所包含的这些功能被移除了。

语言版本开关

我们想帮助你保持你的编译器工具已同步到最新的Visual Studio版本。为了帮助你保持在现有的版本而不是立即移植你的代码到最新C++标准,我们引进了一系列的编译器开关,这些开关可以允许你选择C++标准版本。我们从VS 2015 Update3开始,第一个开关将是/std:c++14, 它反映了当下的编译器状态。我们同时引进了/std:c++latest 开关,这映射出编译器和类库紧跟当今标准草稿的步伐。值得注意的是,类似的开关也同时适用于其它编译器,如GCCClang

编译器开关开启了C++标准的每一个新功能,同时也开启了现有功能的任何重大改变。它们并不用于跟踪MSVC特定的一致性bug。 Bug的修复将继续,其并不依赖于语言开关。如果bug被修复后, 源代码修改更加符合更多的标准一致性,编译器将提供明确的诊断信息。在修复需要更改源代码的bug时,我们会继续保持较高的门槛要求, 同时,我们将会继续文档化每一个修复及其产生的影响。(此页面列出了VS2015已存在的编译器一致性改进文档)

/std:c++14

/std:c++14开关可以开启由Visual C++编译器实现的一系列C++14功能,模板一致性bug修复和正在实现的功能(如, 常量表达式,expression SFINAE, 2-phase名称查找等。)使用/std:c++14后,将提示Visual C++根据C++14标准编译你的代码和关联缺陷报告。在这个更新版本中,std:c++14是默认的语言版本。

每一个版本的C++标准都是基于之前的标准, 除非在不是的情况下。因此,每一个语言版本(这里指的是C++14之后的版本, 因为我们以/std:c++14作为开始)将选择C++14 语义, 除了指示该语言版本的任何其它要求(包含功能的修改或者删除)。使用一个之后的的开关,如/std:c++latest(参见下面章节的 /std:c++latest), 将会开启post-C++14功能而不是C++14功能。 值得注意的是, 我们并没有增加C++11开关的计划。

有一些post-C++14的功能已经在之前发布的Visual C++ 编译器中实施。 为了避免已经使用这些功能的用户要做出重大更改,我们使用/std:c++14开关开启这些功能。 它们包含以下功能,所有的这些功能已包含于Visual Studio 2015 Update 2中:

/std:c++latest

/std:c++latest开关将指向Visual C++编译器所实现的C++标准工作草案中的最新功能。目前,它将跟踪我们加入拟议的post-C++14标准草案中的功能。下一个标准被批准后,/std:c++latest下的句意选择将由/std:c++17所覆盖(假设下一个标准是C++17, 但是标准委员会工作组也许会给出别样的惊喜), 那时,/std:c++latest将会跟踪下一个标准功能草案。换句话说,在默认情况下,/std:c++latest将会使你得到当下所实施的所有新功能。 ( /std:c++latest开关不会开启由/experimental开关控制的新功能。)

总结

Visual C++2015 Update3 中引进了两个开关(/std:c++14和/std:c++latest), 它们可以帮助你控制你所依赖的ISO C++程序设计语言版本和强制在工程里使用你想要的版本。在这个更新版本中,如果你所特定的语言版本不是这二者中的任何一个,编译器将会给出警告并忽略这个开关,指向默认的C++14。 你今天就可以尝试编译器的这个功能——如何获取VS2015 Update RC的详细信息请详见这篇博客: https://blogs.msdn.microsoft.com/visualstudio/2016/06/07/visual-studio-2015-update-3-rc/

结束语

一如往常,我们热切期待你尝试这些变化,并给我们反馈。 反馈的途径有很多,你可以在博客下面评论,发送邮件到visualcpp@microsoft.com, 或者通过任何一种渠道如: 用户声音建议Connect(开bug)或者甚至可以发送笑脸。 我们非常期待来自你的反馈!