支持C99的普遍程度如何?

时间:2008-09-26 13:23:19

标签: c c99 standards-compliance

今天的编译器支持C99标准的普遍性如何?据我所知,即使GCC完全支持它。这是对的吗?

C99的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器能够理解我?

7 个答案:

答案 0 :(得分:22)

如果你想编写可移植的C代码,那么我建议你用C89(旧的ANSI C标准)编写。大多数编译器都支持此标准。

英特尔C编译器具有very good C99 support,它可以生成快速二进制文件。 (谢谢 0x69 !)

MSVC支持some new features,Microsoft计划在未来版本中扩大支持。

GCC支持C99的一些新功能。他们创建了一个关于status of C99 features的表格。可能C99最有用的功能是可变长度阵列,GCC现在支持它。 Clang(LLVM的C前端)支持除浮点pragma之外的大多数功能。

维基百科似乎有nice summary of C99 support个编译器。

答案 1 :(得分:16)

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

我不使用的C99功能,因为它们不受支持包括:

  • 可变长度数组
  • 具有可变参数数量的宏。

我经常使用的C99功能似乎得到了很好的支持(Microsoft除外):

  • stdint.h
  • snprintf() - MS有一个非标准_snprintf(),其严重限制是不总是null终止缓冲区而不指示缓冲区应该有多大

要解决Microsoft的不支持问题,我使用public domain stdint.h from MinGW(我修改后也可以使用VC6)和nearly public domain snprintf() from Holger Weiss

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

  • 混合声明和代码
  • 内联函数
  • _Pragma() - 这使得pragma更加实用

答案 2 :(得分:7)

对于gcc,有一个table with all supported features。似乎缺少的最大的东西是可变长度数组。大多数其他缺少的功能是库问题而不是语言功能。

答案 3 :(得分:5)

IBM c编译器在作为c99调用时具有c99支持,但在作为cc或xlc调用时则不支持。

答案 4 :(得分:3)

请查看C99 suport status for GNU,了解当前支持哪些功能的详细信息。

Sun Studio据称支持整个C99规范。我从来没有用过它们,所以我无法确认。

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

Microsoft似乎在跟踪C ++标准,但不支持C99。 (他们可能会挑选一些功能,但可以说是在重叠的地方挑选C ++ 0x。)

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