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代码”选项。