【问题标题】:Why C++11 compiler support still requires a flag?为什么 C++11 编译器支持仍然需要一个标志?
【发布时间】:2013-12-04 11:04:13
【问题描述】:

我了解默认情况下不应启用编程语言的实验性功能,因此我欢迎标记 -std=c++0x-std=c++1y。然而,几年前 C++11 已经成为标准。为什么编译器仍然需要-std=c++11 来启用对其功能的支持?

【问题讨论】:

  • 相关? nuwen.net/mingw.html ("我已将 GCC 的默认模式更改为 C++11。")
  • 这个问题似乎是题外话,因为它是关于营销和产品包装,而不是计算机编程。
  • @EJP:这是关于如何对高度使用的软件组件进行向后不兼容的更改。就个人而言,我不会让营销部门自己做,而是 YMMV ;-p
  • @DarioP 我不同意您的评论,但请注意:默认情况下,g++ 不完全使用 c++98 模式(或 c++03,两者实际上都表示 C++2003 ) 而是gnu++98 (source),它增加了一些非标准的扩展;这就是为什么我总是明确指定要使用的标准,使用-std=c++98/-std=c++03-std=c++11(并使用-pedantic-errors 强制执行)。所以无论 C++98/03 还是 C++11,我总是需要使用一个标志(至少对于可移植代码):) (这是 GCC 和 Clang;MSVC 不允许你选择。)

标签: c++ c++11 compiler-construction


【解决方案1】:

C++11 已经成为标准几年了,但编译器不会将其默认模式切换到 C++11,直到:

  • 在该编译器及其使用的库中,至少完全支持 C++11。如果编译器编写者对可靠性有任何顾虑,那么它也是稳定的。
  • 最好在编译器中增加主要版本号,因为 C++11 不完全向后兼容 C++03。
  • 理想情况下,按照众所周知的时间表进行,以便用户为变更做好准备。

基本上,很多人(和 makefile)依赖于编译器是一个符合 C++03 的编译器,或者至少依赖于它的不符合性是已知的。由于 C++11 引入了不符合 C++03 的新实例,因此这种变化可能会带来创伤。

可以说,任何依赖 C++03 的人都应该指定一个选项来说明这一点,并且更改为默认模式对他们没有任何影响。但是,一旦您记录了编译器的默认设置,人们就会有意或无意地依赖它。

特别是对于 gcc,4.8.2 手册页说“对 C++11 的支持仍处于试验阶段”。所以我认为最终你的问题的答案可能是正确实施 C++11 需要 2 年多的时间,即使是从标准草案完成的所有工作开始。

【讨论】:

  • 关于第一点:它应该是“完整和稳定的”。从首次实施到真正稳定之间存在一定的时间间隔。
  • @JamesKanze:同意这是非常可取的,负责任的编译器实现者不会发布带有不稳定默认模式的东西。我不太确定将什么定义为“绝对最小值”。出于质量原因,它应该是稳定的,而完整是 -std=c++11 定义的一部分 :-)
  • 这基本上是编译器供应商的判断。大量供应商声称 C++98,然后是 C++03,但从未实现 export。而且不同的供应商也有不同的稳定性标准(他们的标准也各不相同——我记得 g++ 每天都在发布新版本,而今天,他们似乎是更严格的“供应商”之一)。跨度>
  • @JamesKanze:是的,export 是我在说“已知不符合项”时所考虑的具体事情之一。处理一个从未存在的缺失功能比处理突然停止工作的功能要容易很多。甚至是突然开始工作的东西,比如两阶段查找。
  • @RaydelMiranda:不在我的系统上。 echo __cplusplus > version.cpp; g++ -E version.cpp 输出199711L,而g++ -std=c++11 -E version.cpp 输出201103L。那是 gcc 4.8.2。
【解决方案2】:

一个小更新。 GCC 6.1 及以上版本默认使用 C++14 模式[source]

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2017-01-13
    • 2016-12-19
    • 1970-01-01
    • 2017-03-09
    • 2023-03-14
    相关资源
    最近更新 更多