C99的普遍支持程度如何?

时间:2020-03-06 14:47:00  来源:igfitidea点击:

当今的编译器如何普遍支持C99标准?我知道,甚至GCC都不完全支持它。这是正确的吗?

C99的哪些功能比其他功能得到更多支持,即可以用来确保大多数编译器都能理解我的功能?

解决方案

对于gcc,有一个包含所有受支持功能的表。似乎缺少的最大的东西是可变长度数组。其他大多数缺少的功能是库问题,而不是语言功能。

查看GNU的C99支持状态,以了解有关当前支持哪些功能的详细信息。

据称Sun Studio支持整个C99规范。我从未使用过它们,因此无法确认。

我不相信Microsoft编译器完全支持C99规范。目前,他们更加专注于C ++

如果我们想编写可移植的C代码,则建议我们使用C89(旧的ANSI C标准)编写。大多数编译器都支持该标准。

英特尔C编译器具有很好的C99支持,并且可以生成快速的二进制文件。 (感谢0x69!)

MSVC支持一些新功能,Microsoft计划在将来的版本中扩展支持。

GCC支持C99的一些新功能。他们创建了一个有关C99功能状态的表。 C99可能最有用的功能是可变长度数组,GCC现在支持它。 Clang(LLVM的C开头)支持除浮点编译指示之外的大多数功能。

Wikipedia似乎很好地总结了C99对编译器的支持。

Microsoft似乎正在跟踪C ++标准,但不支持C99. (它们可能会挑选一些功能,但可以说是在重叠的地方挑选了C ++ 0x。)

从Visual Studio .NET 2003开始,新项目默认情况下启用了"将C代码编译为C ++(/ TP)"选项。

有人提到英特尔编译器具有C99支持。还有一个完全支持C99的Comeau C / C ++编译器。这些是我唯一知道的。

我不使用的C99功能因未得到很好的支持而包括:

  • 可变长度数组
  • 参数数量可变的宏。

我经常使用的C99功能似乎得到了很好的支持(Microsoft除外):

  • stdint.h
  • snprintf()-MS有一个非标准的_snprintf(),它的严重局限性是:终止缓冲区时不总是空值,也不表明缓冲区应该有多大

为了解决Microsoft的不支持问题,我使用了MinGW的公共域" stdint.h"(我对其进行了修改以也可以在VC6上使用)和Holger Weiss的近公共域" snprintf()"。

Microsoft不支持的项目,但根据项目的不同,它们仍将在其他编译器上使用:

  • 混合的声明和代码
  • 内联函数
  • _Pragma()-这使编译指示更加有用

以c99调用时,IBM c编译器具有c99支持,但以cc或者xlc调用时,则没有。