46

当今的编译器支持 C99 标准的普遍程度如何?我知道即使 GCC 也不完全支持它。这是正确的吗?

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

4

7 回答 7

27

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

英特尔 C 编译器具有非常好的 C99 支持,并且可以生成快速的二进制文件。(感谢0x69!)

MSVC 支持一些新功能,Microsoft 计划在未来版本中扩大支持。

GCC 支持 C99 的一些新东西。他们创建了一张关于C99 功能状态的表格。可能 C99 最有用的特性是可变长度数组,而 GCC 现在支持它。Clang(LLVM 的 C 前端)支持除浮点编译指示以外的大多数功能。

维基百科似乎对编译器的 C99 支持有一个很好的总结。

于 2008-09-26T13:28:20.457 回答
16

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

由于没有得到很好的支持,我不使用的 C99 功能包括:

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

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

  • stdint.h
  • snprintf()- MS 有一个非标准_snprintf(),它具有严重的限制,即不总是空终止缓冲区并且不指示缓冲区应该有多大

为了解决 Microsoft 的不支持问题,我使用了MinGW的公共域stdint.h(我对其进行了修改以也适用于 VC6)和Holger Weiss的几乎公共域snprintf()

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

  • 混合声明和代码
  • 内联函数
  • _Pragma()- 这使得编译指示更有用
于 2008-09-26T19:43:16.580 回答
7

对于 gcc,有一个包含所有受支持功能的表。似乎最大的缺失是可变长度数组。大多数其他缺失的功能是库问题而不是语言功能。

于 2008-09-26T13:26:49.447 回答
6

IBM c 编译器在以 c99 调用时支持 c99,但在以 cc 或 xlc 调用时不支持。

于 2009-08-11T16:08:27.543 回答
4

查看GNU 的 C99 支持状态,了解当前支持哪些功能的详细信息。

Sun Studio声称支持整个 C99 规范。我从未使用过它们,所以我无法确认。

我不相信微软编译器完全支持 C99 规范。他们现在更专注于 C++

于 2008-09-26T13:27:33.657 回答
3

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

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

于 2008-09-26T16:16:53.563 回答
3

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

于 2011-01-17T06:52:40.663 回答