当今的编译器支持 C99 标准的普遍程度如何?我知道即使 GCC 也不完全支持它。这是正确的吗?
C99 的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器会理解我?
当今的编译器支持 C99 标准的普遍程度如何?我知道即使 GCC 也不完全支持它。这是正确的吗?
C99 的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器会理解我?
如果您想编写可移植的 C 代码,那么我建议您使用 C89(旧的 ANSI C 标准)编写。大多数编译器都支持此标准。
英特尔 C 编译器具有非常好的 C99 支持,并且可以生成快速的二进制文件。(感谢0x69!)
MSVC 支持一些新功能,Microsoft 计划在未来版本中扩大支持。
GCC 支持 C99 的一些新东西。他们创建了一张关于C99 功能状态的表格。可能 C99 最有用的特性是可变长度数组,而 GCC 现在支持它。Clang(LLVM 的 C 前端)支持除浮点编译指示以外的大多数功能。
维基百科似乎对编译器的 C99 支持有一个很好的总结。
有人提到英特尔编译器支持 C99。还有完全支持 C99的Comeau C/C++ 编译器。我知道的只有这些。
由于没有得到很好的支持,我不使用的 C99 功能包括:
我经常使用的 C99 功能似乎得到了很好的支持(微软除外):
stdint.h
snprintf()
- MS 有一个非标准_snprintf()
,它具有严重的限制,即不总是空终止缓冲区并且不指示缓冲区应该有多大为了解决 Microsoft 的不支持问题,我使用了MinGW的公共域stdint.h
(我对其进行了修改以也适用于 VC6)和Holger Weiss的几乎公共域snprintf()
Microsoft 不支持但仍将根据项目在其他编译器上使用的项目包括:
_Pragma()
- 这使得编译指示更有用对于 gcc,有一个包含所有受支持功能的表。似乎最大的缺失是可变长度数组。大多数其他缺失的功能是库问题而不是语言功能。
IBM c 编译器在以 c99 调用时支持 c99,但在以 cc 或 xlc 调用时不支持。
查看GNU 的 C99 支持状态,了解当前支持哪些功能的详细信息。
Sun Studio声称支持整个 C99 规范。我从未使用过它们,所以我无法确认。
我不相信微软编译器完全支持 C99 规范。他们现在更专注于 C++
Microsoft 似乎在跟踪 C++ 标准,但不支持 C99。(他们可能会挑选一些特性,但可以说是挑选有重叠的 C++0x。)
从 Visual Studio .NET 2003 开始,新项目默认启用“将 C 代码编译为 C++ (/TP)”选项。
Clang(基于 LLVM 的 C 和 C++ 编译器)具有很好的 C99 支持。我认为它唯一不支持的是浮点编译指示。