任何人都知道为什么__cplusplus
在我的Visual Studio 2012 c ++项目中被定义为199711L
(这是“旧的”C ++)?它不应该说201103L
因为VS 2012现在支持C ++ 11吗?即使我包含C ++ 11标头,它仍然是错误定义的。有线索吗?
答案 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的新值:
据我所知,所有已切换的编译器都属于第二类。
我相信一些编译器供应商过于热衷于改变__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会默认正确报告宏。