【问题标题】:In GCC, Clang and MSVC is there any way to conform against C++98 and not C++03?在 GCC、Clang 和 MSVC 中,有没有办法符合 C++98 而不是 C++03?
【发布时间】:2015-02-06 00:47:19
【问题描述】:

meta question 建议将 标签设为同义词。提问者跟进Is value initialization part of the C++98 standard? If not, why was it added in the C++03 standard?,这是一个很好的问题,它阐明了在 C++03 中添加 值初始化。将此问题视为后者的后续问题。

OP 断言现代编译器不会费心区分 C++98 和 C++03。这让我感到惊讶,因为事实证明三个现代编译器都是如此。虽然这个问题可以归结为“RTFM”,但我的搜索没有找到任何结论。

海合会

他们的standards页面:

最初的 ISO C++ 标准作为 ISO 标准发布 (ISO/IEC 14882:1998) 并由发布的技术勘误修正 2003 年(ISO/IEC 14882:2003)。这些标准被称为 C++98 和 C++03,分别。 GCC 实现了大部分 C++98(导出 是一个明显的例外)和 C++03 中的大部分变化。选择 GCC 中的此标准,使用选项之一 -ansi、-std=c++98 或 -std=c++03; ...

此外,他们的dialect options 页面说:

在 C++ 模式下,[ansi] 等价于 -std=c++98。

并将“c++98”和“c++03”组合在一起:

1998 ISO C++ 标准加上 2003 技术勘误和一些 额外的缺陷报告。与 C++ 代码的 -ansi 相同。

这似乎暗示没有办法打开only C++98 模式。

叮当

我在 Clang 中找到的唯一内容是在他们的 manual 上,上面写着 C++ Language Features

clang 完全实现除了导出的所有标准 C++98 模板(在 C++11 中被删除),...

没有提到 C++03。它还指出:

clang 支持 -std 选项,它改变了 clang 的语言模式 用途。 C 支持的模式有 c89、gnu89、c94、c99、gnu99、c11、 gnu11,以及这些模式的各种别名。如果没有 -std 选项 指定,clang 默认为 gnu11 模式。许多 C99 和 C11 功能是 在早期模式中支持作为符合标准的扩展,并带有警告。

这当然是针对他们的 C 编译器的,我找不到任何关于 C++ 编译器的文档,例如哪些选项可以有效传递给 -std。我只是假设 Clang 反映了 GCC 的方言选项(例如,C++03 在 Clang 上有效),尽管没有证据我不能如此确定地说明。

MSVC

据我所知,MSVC 不允许您像上述两个那样更改语言标准。在MSDN 上搜索“C++98”没有任何结果。他们似乎实现了 C++98/C++11,例如 Herb Sutter 所述。

问题

虽然这些问题听起来很明显,但元问题让我意识到它并不那么明显。

  • 有没有办法让 GCC 只符合 C++98? Enforcing the C++98 standard in gcc 只是链接到我所做的相同文档,没有进一步考虑它是否真的符合 C++98。

  • Clang 是符合 C++98 还是实际上符合 C++03?我在哪里可以找到这方面的相关文档?

  • 对于 MSVC 也是如此。有没有办法将 MSVC 中的语言标准更改为仅符合 C++98?

【问题讨论】:

  • 添加-std=c++98 对真正的代码完全没用,只有傻瓜和编写编译器验证套件的人才会使用它。 C++03 修复了 C++98 中的许多重要缺陷。这将使编译器编写者的生活更加艰难,因为它会增加需要测试的配置和模式的数量,可能会引入错误并通常会给编译器开发人员和用户带来问题,他们都不会真正关心或使用 @ 987654334@ 选项
  • 我也想问同样的问题!

标签: c++98 c++03 c++ visual-c++ gcc clang c++98


【解决方案1】:

有没有办法让GCC只符合C++98?

没有。您已经彻底涵盖了问题中的可用标志,但没有一个可以做到这一点。


Clang 是符合 C++98 还是实际上符合 C++03?我在哪里可以找到这方面的相关文档?

Clang 实现 C++03 减去 export,就像 GCC:

Clang 实现了所有 ISO C++ 1998 标准(包括 ISO C++ 2003 标准中解决的缺陷),但导出(在 C++11 中已删除)除外。


对于 MSVC 也是如此。有没有办法将 MSVC 中的语言标准更改为仅符合 C++98?

没有。正如您所说,您不能在 MSVC 中指定 C++ 版本。有一个编译器标志列表,这不是它们中的任何一个的功能。


C++03 的全部意义在于对 C++98 进行更正,从而有效地彻底替换它,而不是作为一个新单元来遵循它。想要“恢复”这些修复是没有意义的。这就像要求 Windows 7 SP2 启动到 Windows 7 SP1 模式。这不是任何人都愿意支持的模型。

Fictional.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2017-10-17
    • 2015-01-10
    • 2021-08-02
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多