【发布时间】:2015-02-06 00:47:19
【问题描述】:
meta question 建议将c++98 和c++03 标签设为同义词。提问者跟进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