Visual Studio 2012 __cplusplus和C ++ 11

时间:2013-01-03 00:34:57

标签: c++ visual-studio visual-c++ c++11

任何人都知道为什么__cplusplus在我的Visual Studio 2012 c ++项目中被定义为199711L(这是“旧的”C ++)?它不应该说201103L因为VS 2012现在支持C ++ 11吗?即使我包含C ++ 11标头,它仍然是错误定义的。有线索吗?

4 个答案:

答案 0 :(得分:14)

答案 1 :(得分:7)

这实际上取决于您对宏的实际意义。 201103L应该是“这个编译器完全支持编译器和库中的所有C ++ 11吗?”它应该意味着“这个编译器支持一些合理的C ++ 11子集吗?”它是否意味着“此编译器以某种方式,形状或形式支持至少一个 C ++ 11功能?”

每个实现都要决定何时推出版本号。 Visual Studio与Clang和GCC不同,因为它没有单独的C ++ 03编译模式;它提供了一组特定的功能,这就是它提供的功能。

通常,单个宏不是决定何时使用某些功能的有用工具。 Boost.Config是一种更可靠的机制。标准委员会在该标准的未来版本中为investigating ways of dealing with this problem

答案 2 :(得分:4)

我和尼科尔在这一次。测试__cplusplus >= 201103L的唯一原因是检查是否可以使用新功能。如果编译器只实现了一半的新功能但使用了__cplusplus的新值,那么它将无法编译许多受__cplusplus >= 201103L保护的有效C ++ 11代码(我有一些使用{ {1}}和thread_local引用)。另一方面,它保留*this,它将使用安全的C ++ 98代码,这仍然很好。它可能会错过一些优化方式,但您仍然可以使用其他方法来检测特定功能是否可用(编译器版本,编译器特定的宏,如199711L,提升宏检查编译器宏等等)。重要的是安全的默认值。

有两种可能的原因可以切换到__cplusplus的新值:

  • 您的编译器对C ++ 11有完整支持(或者足够接近,总会有错误)
  • 这是编译器的一种实验模式,不应该在生产中使用,通常缺少的功能会被视为错误。

据我所知,所有已切换的编译器都属于第二类。

我相信一些编译器供应商过于热衷于改变__cplusplus的值(最简单的C ++ 11功能实现,良好的宣传),并且有些人更保守。

答案 3 :(得分:0)

自2018年4月起,MSVC 2017现在可以正确报告宏,但仅在使用特定开关的情况下(/ Zc:__ cplusplus)。这是因为许多旧代码依赖于为MSVC编译器检测宏的旧值。 来源:https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/

希望在将来,世界各地的人们更新代码后,MS会默认正确报告宏。