今天编译器支持的C99标准有多普遍?据我所知,即使GCC完全支持它.这是正确的吗?
C99的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器都能理解我?
如果你想编写可移植的C代码,那么我建议你用C89(旧的ANSI C标准)编写.大多数编译器都支持此标准.
英特尔C编译器具有非常好的C99支持,可以生成快速的二进制文件.(谢谢0x69!)
MSVC支持一些新功能,Microsoft计划在未来版本中扩展支持.
GCC支持C99的一些新功能.他们创建了一个关于C99功能状态的表格.可能C99最有用的功能是可变长度阵列,GCC现在支持它.Clang(LLVM的C前端)支持除浮点pragma之外的大多数功能.
维基百科似乎对编译器的C99支持有一个很好的总结.
有人提到英特尔编译器支持C99.还有Comeau C/C++编译器,它完全支持C99.这是我所知道的唯一.
我不使用的C99功能,因为它们不受支持包括:
可变长度数组
具有可变数量参数的宏.
我经常使用的C99功能似乎得到了很好的支持(除了Microsoft):
stdint.h
snprintf()
- MS具有非标准_snprintf()
,其严重限制是不总是空终止缓冲区并且不指示缓冲区应该有多大
为了解决微软的不支持问题,我使用了MinGW的公共域stdint.h
(我修改了也适用于VC6)和Holger Weiss的近公共域snprintf()
Microsoft不支持但仍将在其他编译器上使用的项目,具体取决于项目包括:
混合声明和代码
内联函数
_Pragma()
- 这使得pragma更加实用
对于gcc,有一个包含所有支持功能的表.似乎缺少的最大的东西是可变长度数组.大多数其他缺少的功能是库问题而不是语言功能.
IBM c编译器在作为c99调用时具有c99支持,但在作为cc或xlc调用时则不支持.