自从我们第一次发布VisualStudio2015以来,我们已经讨论了很多 微软Visual C++编译器与库(MSVC) 此博客中的一致性改进。我们的团队一直致力于让MSVC成为Windows上开发的最佳编译器工具集,并且从完全符合现有C++标准开始。这篇文章将回顾我们在MSVC上取得的进展,并展望我们在下一个版本中的计划。
我们不仅仅是执行C++标准,我们还帮助开发它。MSVC团队是C++标准发展的主要贡献者。除了参加标准委员会会议外,三个主要技术规范的编辑, 模块 ,和范围)在MSVC团队工作。我们还保持 开源叉子 在我们的编译器上工作。
创建一致性工具集
2015年,我们启动了一个项目,该项目将从根本上改变编译器解析和分析代码的方式。我们称之为工作 编译器年轻化 Jim Springfield在2015年9月的优秀博客文章中使用了一个术语。我们首先用VS 2015发布了复兴工作,但我们今天仍在努力。对我们来说,在当前的编译器中展示价值,保持与现有代码的兼容性,并为MSVC完全符合标准的未来做好准备,一直都是很重要的。
我们的编译器一致性进度显示了恢复工作和其他一致性工作的好处。我们已经实现了几乎所有的特性在C++ 11和C++ 14标准中介绍。当然,总有一些bug,但是只有三个特性区域没有实现。我们还没有从C++ 98中进行二相名称查找,我们没有一个一致的预处理器,而且我们仍然有表达式SimaEa的不完整实现。
这一进展反映了整个编译器的巨大投资,但我们在 表达SFINAE 以及constexpr和扩展constexpr的工作: 我们现在的实现符合扩展的CopExPR的C++ 14规则。 . 我们非常感谢我们的客户急于告诉我们哪里还有问题。对于constexpr来说尤其如此,其中 你们中有150多人给我们发了代码样本,显示了constexpr的错误 留在我们的编译器中。您在调查中提供的所有代码片段都已转换为测试用例。他们都通过了VS2017编译器。
我们也收到了你的来信 连接 , 用户语音 , 在IDE中报告问题 , 电子邮件 , 推特@visualc , Facebook在Microsoft Visual Cpp ,以及许多其他频道。我们已经 在每次更新中始终修复200到300个开发人员报告的错误 . 感谢您抽出时间帮助我们确定问题!
修复我们工具集中的一致性错误不可避免地需要对源代码进行一些更改。一次将所有代码迁移到新的编译器特性并不总是那么容易。我们介绍了 标准版本开关 去年,你选择了使用最新的草稿标准(即C++ 17)的特征。我们在编译器中创建了一个新的一致性模式, /放任的- ,允许您选择禁用Microsoft特定一致性问题的模式。最后,我们开始 更新 __MSC_VER
编译器版本宏 每次编译器工具集更新 __MSC_FULL_VER
每个生成的宏。这允许您以编程方式测试编译代码的编译器的确切版本。
在我们的编译器中,一些遗留的bug和非标准行为可能会产生意外的运行时影响和不正确的行为。为了使编译器朝着一致性的方向前进,必须在编译器的默认模式下修复这些bug。当引入这些更改时,我们 仔细地跟踪它们,并提供前后代码片段,以及进行更改的建议和原理 .
有时,就像 标准委员会最近在合作项目TS中对关键字进行了更改 ,我们无法控制所需的代码更改。但我们知道,在迁移到较新的工具集时,尽量减少对代码所做的任何更改是很重要的。
不断更新新功能
我们在一致性问题上花了很多时间,但我们不仅仅是在追赶。我们已经实现了C++ 17编译器的特性。我们已经在编译器中发布了一些标准特性草案,还有十几个已经排队等待VS2017的下一次更新发布。 我们的目标是在ISO批准标准时完成C++ 17标准的实现。我们目前的计划是在2017年年底前完成功能。
我们在这方面也继续取得良好进展 随着标准的发展实现库功能 . 你可能还记得VS 2015 Update 2 C++完成的17个特性的特性 . 我们期望在标准发布之前实现所有主要的C++ 17库特征。
我们首先关注的是MSVC中缺少的其余标准一致性特性。在MSVC中还有两个大的特征:C++ 98的二相名称查找和C++ 11的C++预处理器。我们已经开始在新的一致性模式/permissive-下实施两阶段名称查找,并将在2017年中期预览两阶段名称查找支持。我们还计划开始实施符合该标准的预处理器。我们还期待着实现剩余的C++ 17特性以及一些重要的技术规范,如概念。
我们保持一个 MSVC工具集的编译器特性和标准库特性摘要 . 您可以使用这个列表跟踪我们的进展,因为我们实现C++ 17语言和库特征。
除了一致性,我们考虑了现代C++编译器的表桩,我们还大量地不断地投资于代码性能、安全性、构建吞吐量、诊断和分析,以便我们能够 Windows上最好的编译器工具集 .
与VS IDE的一致性集成
我们不仅在编译器工具集中提供了一致性改进,而且在VS C++ IDE中也进行了相同的一致性更改。你可能还记得我们用( 独立的编译器,EDG,用于IDE生产力特性 )我们小心地打开EDG中的行为,以匹配工具集中的一致性修复。
例如,下面是Visual Studio 2017 constexpr
将鼠标悬停在编辑器中的变量上时的求值:
标准物质 docs.microsoft.com
您可以找到有关 Visual C++ 2017中的一致性改进 ,我们的 当前编译器和库一致性状态 ,以及我们的编译器仍然展示的地方 不规范行为 在 docs.microsoft.com .
最后
一如既往,我们欢迎您的反馈。欢迎通过电子邮件发送任何评论 visualcpp@microsoft.com ,通过 推特@visualc ,或Facebook Microsoft Visual Cpp .
如果您在VS 2017遇到MSVC的其他问题,请通过 报告问题 选项,从安装程序或VisualStudioIDE本身。跟踪您对 开发者社区门户 . 如需建议,请告知我们 用户语音 . 谢谢您!