Visual Studio 2012 uu cplusplus和C++;11 P> >代码> > CPLUS PLUS 定义为< VisualStudio 2012 C++项目中的“代码> 1997 711L/(这是“旧”C++)?既然VS 2012现在有C++ 11的支持,它不应该说 201103L < /代码>吗?即使我包含C++ 11个头,它仍然被错误地定义。有什么线索吗?

Visual Studio 2012 uu cplusplus和C++;11 P> >代码> > CPLUS PLUS 定义为< VisualStudio 2012 C++项目中的“代码> 1997 711L/(这是“旧”C++)?既然VS 2012现在有C++ 11的支持,它不应该说 201103L < /代码>吗?即使我包含C++ 11个头,它仍然被错误地定义。有什么线索吗?,c++,visual-studio,visual-c++,c++11,C++,Visual Studio,Visual C++,C++11,这已经提交给Microsoft审查: 这实际上取决于您期望宏的实际含义。201103L的意思是“此编译器完全支持编译器和库中的所有C++11?”是指“此编译器支持C++11的某些合理子集?”是指“此编译器以某种方式、形状或形式至少支持一个C++11功能?” 实际上,由每个实现决定何时增加版本号。VisualStudio不同于Clang和GCC,因为它没有单独的C++03编译模式;它提供了一组特定的功能,这就是它所提供的 通常,单个宏不是决定何时使用某些功能的有用工具。是一种更可靠的机制。标准委员

这已经提交给Microsoft审查:


这实际上取决于您期望宏的实际含义。201103L的意思是“此编译器完全支持编译器和库中的所有C++11?”是指“此编译器支持C++11的某些合理子集?”是指“此编译器以某种方式、形状或形式至少支持一个C++11功能?”

实际上,由每个实现决定何时增加版本号。VisualStudio不同于Clang和GCC,因为它没有单独的C++03编译模式;它提供了一组特定的功能,这就是它所提供的


通常,单个宏不是决定何时使用某些功能的有用工具。是一种更可靠的机制。标准委员会正在制定标准的未来版本。

在这一点上,我同意Nicol的观点。测试
\uuu cplusplus>=201103L
的唯一原因是检查您是否可以使用新功能。如果一个编译器只实现了一半的新特性,但使用了新值
\uuuCPlusplus
,它将无法编译大量受
\uuuCPlusplus>=201103L
保护的有效C++11代码(我有一些使用
线程本地
*此
引用)。另一方面,如果它保持
199711L
,它将使用安全的C++98代码,这仍然很好。这样可能会错过一些优化,但您仍然可以使用其他方法来检测特定功能是否可用(编译器版本、编译器特定宏,如
\uuuuugxx\u EXPERIMENTAL\ucx0x\uuuux
、检查编译器宏的boost宏等)。重要的是安全违约

切换到uu cplusplus的新值可能有两个原因:

  • 您的编译器对C++11有完全的支持(或者足够接近,总会有bug)
  • 这是编译器的一种实验模式,不应该在生产环境中使用,通常缺少的特性将被视为bug
据我所知,所有已切换的编译器都属于第二类


我相信一些编译器供应商对更改uu cplusplus(最容易实现的C++11功能,很好的宣传)的值太过热情了,有些更保守是好的。

截至2018年4月,MSVC 2017现在正确地报告了宏,但前提是使用了特定的开关(/Zc:u cplusplus)。这是因为许多旧代码依赖于检测MSVC编译器中宏的旧值。 资料来源:


希望将来,一旦全世界的人都更新了他们的代码,MS将在默认情况下正确报告宏。

谢谢。我已经在bug报告中添加了我自己的评论。我们现在看到2014年,VS 2013已经出来了,而且这个标志似乎仍然报告旧版本(按照上面链接中的讨论)。如果你在这里查看支持的特性,它们甚至会开始在C++ 14中拉:“VisualStudio 2013中的VisualC++可以进一步扩展这个覆盖范围,并且还支持一些选择的C++ 14库特征。”我真的不明白,为什么每个人都可以选择要实现哪些特性。这将越来越破坏便携性@flohack-如果你观看了适当的技术讲座,你会发现VS团队实现不同功能的工作量是。。。嗯。。。不一样。有些东西很快,有些东西不快。他们可以快速地向库中添加
make_unique
,因为这不需要时间。您还将了解到,MS在标准化方面开创了一些先河,例如异步/等待提案,因此他们也对其进行了优先排序,以便我们有一个可行的实现来完善我们的想法/提案。不是他们在选择实施什么,而是他们在选择何时实施。马克,我同意。然而,我质疑标准组织的节奏。如果主要供应商在实现特性方面落后了,那么可能下一次标准迭代已经开始,它看起来似乎不是一个有用的标准化战略,而是一个市场炒作工具。正如我在学校学到的,标准应该有助于行业(和市场)使事情更具可比性,并防止供应商之间存在不公平的兼容性问题。然而,这种情况下,代码的可移植性可能会受到严重影响。同样适用于Visual Studio 2019(您需要手动将
/Zc:\uu cplusplus
添加到项目命令行选项)。如果您依赖于
\uuu cplusplus
,请添加命令行开关。如果您仅在Windows上使用VisualStudio,则基于选择的C++标准, MMScLangLang< /Cord>宏可能更适合这种更改。由于存在一个解决方案,微软似乎不太可能在这方面做出让步。