在GCC中,Clang和MSVC是否有任何方法可以符合C++ 98而不是C++ 03?

6 c++ gcc clang visual-c++ c++98

元问题提出了的标签应作出的同义词.问题提问者跟着它进行了C++ 98标准的Is值初始化部分?如果没有,为什么它被添加到C++ 03标准中?,一个很好的问题,它揭示了向C++ 03 添加值初始化.考虑这个问题是后者的后续行动.

OP断言现代编译器不打扰区分C++ 98和C++ 03.这对我来说是令人惊讶的,因为事实证明是三个现代编译器的情况.虽然这个问题可以归结为"RTFM",但我的搜索还没有找到任何结论.

GCC

他们的标准页面:

最初的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; ...

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

在C++模式下,[ansi]相当于-std = c ++ 98.

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

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

这似乎意味着没有办法打开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?

Lig*_*ica 8

有没有办法让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模式.它不是任何人都想要支持的模型.

虚构.