使用 _MSVC_LANG 代替 __cplusplus 安全吗?

问题描述 投票:0回答:1

我正在尝试使用 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
来自 Microsoft 博客的这篇文章 建议您也检查一下
_MSVC_LANG

_MSVC_LANG >= 201402L
在多大程度上不符合C++11?

c++11 visual-c++
1个回答
3
投票

首先,如果您想要一个便携式解决方法,您可以这样做:

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

您链接的评论指出,这是一个错误,

__cplusplus
设置不正确,测试
_MSVC_LANG
只是权宜之计。然而,带有
/std:c++14
的 VC 2017 (19.10.25017) 仍然将
__cplusplus
设置为
199711
。我不确定这是否意味着 C++14 支持尚未完全完成,或者他们只是从未抽出时间来实现。

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

ETA: 感谢一位匿名评论者指出,有一个

/Zc:__cplusplus
编译器开关,它将
__cplusplus
的值设置为与
_MSVC_LANG
相同。如果没有此标志,MSVC 19 不会更改
__cplusplus
的版本,因为显然这破坏了现有代码。

© www.soinside.com 2019 - 2024. All rights reserved.