如何检测Visual Studio C++编译器是否支持C++11?

3

如何通过预处理宏检测Visual Studio(VS) C++编译器是否支持C++11?我试过使用__cplusplus(许多人建议用于这种检查的预处理宏),但在VS C++ 2010编译器下失败了(即函数get_dimension从未被声明):

#if __cplusplus > 199711L
    int get_dimension(int index);
#endif

2
也许更好的问题是,为什么你在使用一个十年前的Visual Studio版本? - Panagiotis Kanavos
2
@PanagiotisKanavos:也许吧...但这并不否定在这里发布的原始问题!:) - user7698505
5
“它失败”是什么意思?难道不应该对于不支持C++11的编译器不声明该函数吗?在我看来,这似乎是成功的。 - eerorika
8
为什么你会期望一个2010年发布的编译器完全支持C++11(在2011年得到正式认可)? - Richard Critten
也许这个可以帮助你: https://dev59.com/_Wgu5IYBdhLWcg3w6bKo - Caduchon
显示剩余4条评论
2个回答

2
您可以直接使用预定义宏_MSVC_LANG进行检查。 __cplusplus是一种语言多编译器的高级解决方案,但不幸的是,在MSVC中需要启用它才能有意义地使用(并且可能不支持非常旧的版本)。这对于使用例如gcc的人来说非常棒,因为它默认设置了版本(大多数这些人也会认为它在MSVC上也适用)。因此,只有在您需要支持许多编译器时才需要担心,并且即使在这种情况下,我也会考虑为某些编译器添加特殊检查,即MSVC
有关详细信息,请参见C ++团队博客

2
对于他们当前的编译器,这应该没问题:MSVC现在正确地报告__cplusplus - Ted Lyngmo
@TedLyngmo 很好的观点,很高兴听到 - 不幸的是它目前并没有帮上太大忙,因为它无法回到过去 - 也许需要5或10年。 - darune
确实 - 我们必须暂时忍受它 :) - Ted Lyngmo

0

您需要使用#if __cplusplus >= 201103L来检查编译器是否完全符合C++11标准。如果返回false,则表示编译器不支持C++11或仅支持其子集。

现在,如果您只需要使用C++11中的一些特定功能,则可以使用Boost进行检查。例如,如果您需要constexpr支持,则使用:

#ifndef BOOST_NO_CXX11_CONSTEXPR

你也可以使用一些{{link1:宏},允许在C++03编译器中使用C++11特性},例如BOOST_CONSTEXPR

但更好的解决方案是使用_MSC_VER_MSC_FULL_VER完全排除古老的编译器。

#if _MSC_VER > 1600

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接