在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 标签设为同义词。提问者接着问 值初始化是 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++在C++模式下,[ansi] 等效于 -std=c++98。
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模式一样。它只是不是任何人都想要支持的模型。
†虚构的。
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- C++98,但叮叮当当地说使用nullptr?
- Boost 绑定和"result_type":不是成员,对 c++03 友好
- C ++枚举范围无法使用-std=c ++ 98进行编译,但使用-std=c ++ 11可以
- 如何在Visual Studio 2019中启用C++98编译?
- 使用 C++98 标准填充二维静态向量
- 了解 printf 格式规范中的 %03.3u
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 在 C++98/03 中以相反的顺序将 C 数组附加到向量,而无需 for 循环
- Google的protobuf版本是用-std=c++98或-std=c++03构建的?
- C 98/C 03 STL设置错误
- C++98/C++03中聚合末尾的附加逗号
- 值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它
- 在GCC中,Clang和MSVC有没有办法符合C++98而不是C++03
- 我们需要一个可访问的复制构造函数来初始化C++98/03中的值吗
- 使用标准C++98/03对一个对象进行干净的分配和构造
- C++98/03 std::is_constructible implementation
- C++98/03引用折叠和cv限定符
- 新的C++11模板方法是否会使以前的C++98/03 push_back/insert方法过时