在MSVC中完全支持C/C++兼容预处理器

更新日期:2021年6月8日 C11、C17公告岗 包含有关如何获取与一致预处理器一起使用的最新Windows SDK的说明。

null

我们很高兴地宣布,从VisualStudio2019版本16.6预览版2开始,MSVC工具集中完全支持一致的预处理器。

从最初的 博客文章 宣布预处理器一致性改变,我们已经走过了漫长的道路,现在准备宣布C++/C++一致性预处理器的完成,并通过 /Zc:preprocessor 开关。除了标准一致性外,预处理器还支持C++ 20的 __VA_OPT__ 也可以在C语言模式下使用。

为了达到一致性,在预处理器和MSVC编译器中添加了一些附加功能,包括各种错误修复, __VA_OPT__ ,和 _Pragma 支持。

涉及预处理器各个部分的错误修复,从 参数展开 还有一些特殊的宏名,比如 __功能__ 报告 算术错误 和行号修正。特别感谢Edward Diener提供了大量有价值的反馈!

__选择__

__VA_OPT__ 是C++ 20中的变量宏的新特性。它允许您根据变量的宏调用附加参数来选择令牌。一个例子是逗号省略的标准化方式。

#define M(X, …) X __VA_OPT__(,) __VA_ARGS__
M(3) // expands to 3
M(3, 4) // expands to 3, 4

_布拉格马

A-语用算子一直是预处理器的一个缺陷,并且在C++和C99中是一个标准一致性的拦截器。虽然MSVC有不一致的u pragma,但语义上的不同之处在于pragma将字符串文字作为其参数,而不是一系列预处理器标记。此功能现已实现。

_Pragma(“once”)
#define GUARD _Pragma(“once”)

其他

有一些 与模块相关的上下文关键字更改 . 这些更改解除了C++ 20模块工作的阻塞。

只有预处理器的输出(通过/E和/P)现在更漂亮了,减少了行指令的数量并修复了一些格式 问题 .

使用一致预处理器所需要的就是添加 /Zc:preprocessor 到编译标志。该标志可在C和C++语言模式下使用。它适用于任何语言级别,但我们计划为 /std:c++latest 在未来的版本中。

语言模式 /预处理器
/std:c++14 不暗示
/std:c++17 不暗示
/std:c++latest 在将来的更新中暗示(在VS 2019 v16.6中不暗示)

通过检查宏 _MSVC_TRADITIONAL 已定义并设置为0。

#if defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL
// old behavior
#else
// new behavior
#endif

遗留的预处理器不会去任何地方,它将继续充当旧代码的兼容层,但它只会以保持旧代码正常工作为目的提供服务。此外 /experimental:preprocessor 开关仍然可用并将激活 /Zc:preprocessor 在VS2019 v16.6中,但将在将来的版本中删除。任何配置为使用实验性交换机的项目都应该迁移到支持的版本。

改进的诊断正在进行中,这将为宏调用和错误提供更好的扩展上下文。

这个特性目前没有被任何其他标志所暗示,但是我们计划将它包含在/std:c++latest 一旦我们稳定了公共SDK头,避免使用不一致的宏。建议使用最新的windowsdk,因为许多嘈杂的警告在更高版本的SDK中已经修复。

让我们知道如何符合预处理器为您工作!在Visual Studio 2019版本16.6预览版2中获取它(请参见 https://visualstudio.microsoft.com/vs/preview/ 下载链接)并试用。

一如既往,我们欢迎您的反馈。我们可以通过下面的评论或电子邮件联系我们(visualcpp@microsoft.com). 如果您在Visual Studio或MSVC中遇到问题,或有任何建议,请通过“帮助”>“发送反馈”>“报告问题/在产品中提供建议”或通过 开发者社区 . 你也可以在Twitter上找到我们( @视觉 ).

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