在GCC中,Clang和MSVC有没有办法符合C++98而不是C++03

In GCC, Clang and MSVC is there any way to conform against C++98 and not C++03?

本文关键字:C++98 C++03 GCC Clang 有没有 MSVC      更新时间:2023-10-16

元问题建议将 c++98 和 c++03 标签设为同义词。提问者接着问 值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它?这是一个很好的问题,它阐明了在 C++03 中添加值初始化。将这个问题视为后者的后续行动。

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

海湾合作委员会

他们的标准页面:

最初的ISO C++标准作为ISO标准发布 (ISO/IEC 14882:1998(并经发布的技术勘察修订 2003年(ISO/IEC 14882:2003(。这些标准被称为C++98 和C++03。海湾合作委员会实施大部分C++98(出口( 是一个值得注意的例外(和 C++03 中的大多数更改。要选择 GCC 中的此标准,请使用选项之一 -ansi、-std=c++98 或 -std=c++03;...

此外,他们的方言选项页面说:

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

并将"c++

98"和"c++03"组合在一起:

1998 年 ISO C++ 标准加上 2003 年技术勘误表和一些 其他缺陷报告。与 -ansi 相同,用于C++代码。

这似乎意味着没有办法打开C++98模式。

我唯一找到的Clang是在他们的手册上,它在C++语言功能下说:

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?在 gcc 中执行 C++98 标准只是链接到我所做的相同文档,而没有进一步考虑它是否真的符合 C++98。

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

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

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

不。您已经彻底涵盖了问题中的可用标志,并且它们都无法做到这一点。


Clang是否符合C++98或实际上符合C++03?我在哪里可以找到相关文档?

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

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

  • http://clang.llvm.org/cxx_status.html

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

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

  • http://msdn.microsoft.com/en-us/library/fwkeyyhe.aspx

C++03的全部意义在于对98 C++进行更正,从而有效地彻底替换它,而不是将其作为一个新单位。想要"还原"这些修复程序是没有意义的。这就像要求Windows 7 SP2启动到Windows 7 SP1模式一样。它只是不是任何人都想要支持的模型。

虚构的。