使用 _MSVC_LANG 代替 __cplusplus 安全吗?

2024-02-07

我正在尝试使用 Microsoft Visual C++ 编译器(以前使用 GCC 以及其他编译器)编译多平台 C++ 项目。

现在我遇到了一些像这样的预处理器指令:

#if __cplusplus < 201103L
    // Define some macros of C++11 the code really relies on.
    // [...]
#endif

虽然我使用的是Visual Studio 2015,__cplusplus仍然定义为199711L. 这篇文章来自微软博客 https://blogs.msdn.microsoft.com/vcblog/2016/06/07/standards-version-switches-in-the-compiler/建议还检查一下_MSVC_LANG.

到什么程度_MSVC_LANG >= 201402L不符合C++11?


首先,如果您想要一个便携式解决方法,您可以执行以下操作:

#if __cplusplus < 201103L && _MSVC_LANG < 201103L
/* ... */
#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L

您链接的评论指出这是一个错误__cplusplus设置不正确并且测试_MSVC_LANG是权宜之计。然而,VC 2017 (19.10.25017)/std:c++14仍然设置__cplusplus to 199711。我不确定这是否意味着 C++14 支持尚未完全完成,或者他们只是从未抽出时间来支持它。

The _MSVC_LANG宏是 Microsoft 的扩展。大多数其他编译器不会设置它,以便更容易测试编译器是否是 Microsoft。 (一个例外:clang++ --std:c++14 -fms-compatibility-version=19.10将同时设置__cplusplus and _MSVC_LANG to 201402L,因为这是它的 MSVC 兼容模式。)

ETA:感谢一位匿名评论者指出,有一个/Zc:__cplusplus编译器开关,它设置的值__cplusplus以匹配您选择的变体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 _MSVC_LANG 代替 __cplusplus 安全吗? 的相关文章

随机推荐