糟糕的编译器不支持C ++(98/03)的功能吗?

时间:2010-12-28 20:59:59

标签: c++ compiler-construction

我经常阅读一些软件,删除一些C ++功能,以便与差/旧/异国情调的C ++编译器兼容。

This one只是我进入的最后一个:Box2D没有使用名称空间,因为他们需要支持:

  

可靠的命名空间支持可怜的C ++编译器

我能想到的一个更大的例子是Qt,它依赖于MOC,正在限制模板的使用,并且正在避免使用模板(好吧,这至少对于Qt3和以前的版本来说是正确的,Qt4主要是这样做以保持他们的约定。)


我想知道哪些编译器很差?
那里有lots of C++ compilers(我从来没有听说过它们中的大部分),但是我希望它们都支持最常见的(/简单的)C ++特性,比如命名空间(除非它们已经死了);情况不是这样吗?

最不受支持的功能有哪些?
我很容易发现缺少外部模板,可能是模板部分特化和类似功能。最多甚至是RTTI或例外,但我从未怀疑过命名空间。

7 个答案:

答案 0 :(得分:8)

根据我的经验,人们只是害怕新事物,特别是20年前曾经破坏过的东西。在本世纪所写的任何内容中都没有正当理由反对使用命名空间。

如果你正在寻找可以抛弃的东西,如果你不久前就瞄准了Windows,你不仅要做的不仅仅是用C ++抛出功能而不是使用它们,你必须使用不同的语法。模板作为VC中支持的功能之一而浮现在脑海中。他们变得更好但有时仍然失败。

该特定编译器不支持的另一个(STILL!)是重载虚函数,以返回使用MI时基本版本返回的类型的派生类型指针。 VC很简单,你最终不得不做virtual_xxx()并提供非虚拟“xxx()”函数来复制标准行为。

答案 1 :(得分:4)

  

最不受支持的功能有哪些?

让我们抽象出export,遗憾的是,这是一次失败的实验。然后,根据编译器用户的数量,这可能是 两阶段查找 ,而Visual C ++仍然没有正确实现。 VC拥有很多用户。

答案 2 :(得分:2)

基本上是在C ++ 98中作为标准化过程的一部分添加的任何内容。那就是:

  • 模板(不只是部分专业化 - 我的意思是所有模板)
  • 异常(通常因为这个需要运行时支持/开销 - 它们通常不适用于微控制器等)
  • 命名空间
  • RTTI

如果你年纪大了,你可以添加

  • 标准库中的大多数内容。

几个旧的编译器都很糟糕; OTOH我强烈建议不要担心它们。已经有几个好的,免费提供的合理标准兼容编译器可用于我所知道的几乎所有平台(主要是通过G ++)。

答案 3 :(得分:1)

命名空间一直在周围。也许是模板中的一些较暗的地方。但命名空间?没门。即使使用模板,绝大多数使用场景都很好。有些编译器并不完美(它们是软件),但是不支持不导出的C ++ 03功能?那不会发生。大多数编译器扩展语言,而不是 reduce ,并且正在转向支持C ++ 0x。

RTTI和例外通常被指责实施效率低下,但实施一致性并不差。

答案 4 :(得分:1)

如果您使用主流编译器在主流中进行编程,那么通常您会发现支持C ++ 03标准的所有内容(除了sbi所提到的导出(但是后来没有人使用该功能(因为它不受支持) ))。从主流开始,编译器通常较少的功能(但它们都在前进(一些比其他更慢))

只有当您使用较少使用的硬件时,才会有自己的专有编译器支持功能开始减少。

主要的例子是移动设备及其相关的编译器(尽管近年来它们在主流中很受欢迎,但这些编译器的更新速度比以前更快。)

SOC设备的第二个例子。编译器是如此具体,以至于它们通常都是内部编译器,并且只能像SOC公司所能承受的那样在它们上面做很多工作,因此往往会落后于其他编译器很长时间(或者至少进一步)。

答案 5 :(得分:1)

值初始化(C ++ 03功能)是not properly implemented in MSVC++

答案 6 :(得分:0)

Qt不使用模板太多,因为它比模板旧。