C99如何普遍支持?

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

C99的哪些function比其他function更受支持,也就是说我可以使用哪些function来确保大多数编译器能够理解我?

谢谢

如果你想写可移植的C代码,那么我build议你写在C89(旧的ANSI C标准)。 这个标准是由大多数编译器支持的。

英特尔C编译器有非常好的C99支持 ,它产生快速的二进制文件。 (感谢0x69 !)

MSVC支持一些新function ,微软计划在未来的版本中扩大支持。

GCC支持C99的一些新function。 他们创build了一个关于C99function状态的表格。 C99最可用的function可能是可变长度数组,而GCC现在支持它。 Clang (LLVM的C前端)支持除浮点杂注外的大多数function。

维基百科似乎对编译器的C99支持有一个很好的总结 。

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

我不使用的C99function,因为它们得不到很好的支持,包括:

  • 可变长度数组
  • 具有可变数目参数的macros。

我经常使用的C99function似乎得到了很好的支持(微软除外):

  • stdint.h
  • snprintf() – MS有一个非标准的_snprintf() ,它有严重的局限性,并不总是null终止缓冲区,也不指示缓冲区应该多大

为了解决微软不支持的问题,我使用了一个来自MinGW的公共域stdint.h (我修改了VC6)和一个来自Holger Weiss的公开域snprintf()

Microsoft不支持的项目,但依赖于该项目,仍将在其他编译器上使用的项目包括:

  • 混合声明和代码
  • 内联函数
  • _Pragma() – 这使得编译更加可用

对于gcc,有一个包含所有支持function的表格 。 这似乎是最大的缺失是可变长度的数组。 大多数缺失的function是库问题,而不是语言function。

IBM c编译器在以c99调用时支持c99,但在以cc或xlc调用时不支持。

查看GNU的C99支持状态,了解目前支持哪些function的详细信息。

Sun Studio声称支持整个C99规范。 我从来没有用过,所以我不能确认。

我不相信微软的编译器完全支持C99规范。 目前他们更关注于C ++

Clang(基于LLVM的C和C ++编译器)具有相当不错的C99支持。 我认为它唯一不支持的是浮点编译指示。

微软似乎正在跟踪C ++标准,但不支持C99。 (他们可能会挑选一些function,但可以说是樱桃采摘C ++ 0x,其中有重叠。)

从Visual Studio .NET 2003开始,新项目默认启用“编译为C ++(/ TP)的C代码”选项。