C99的普遍支持程度如何?
当今的编译器如何普遍支持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调用时,则没有。