C99被广泛支持吗?

47

当今的编译器普遍支持C99标准吗?我知道即使是GCC也没有完全支持。这是正确的吗?

C99的哪些特性得到了更广泛的支持,即哪些特性可以让我相当确定大多数编译器都会理解我的代码?


3
除了漂亮的语法(例如命名结构初始化器)之外,C99还添加了许多有用的数学库函数,比如long lrtint(double); 它执行快速舍入操作,否则你需要像(long)(x + 0.5)一样自己编写。不要忘记使用库。 - Peter Cordes
Portland Group的高性能PGCC编译器完全符合C99标准。 - Z boson
7个回答

28
如果想要编写便携式的C代码,建议使用C89(旧版ANSI C标准),该标准由大多数编译器支持。
英特尔C编译器非常好地支持C99,并且生成的二进制文件快速。 (感谢0x69!)
MSVC支持一些新功能,微软计划在未来版本中扩展支持。
GCC支持C99的一些新功能。他们创建了一个表格,关于C99功能的状态。可能最有用的C99特性是可变长度数组,现在GCC也支持它。 Clang(LLVM的C前端)支持除浮点指示符外的大多数功能。
维基百科似乎有一篇很好的C99编译器支持摘要

7
GCC 4.5最终将可变长度数组标记为完成而非损坏 - u0b34a0f6ae
可变长度数组在GCC 4.2中存在问题(对于使用Xcode 3.2.3作为标准的任何人) - Remover
3
英特尔不完全支持C99,缺少长双精度(long double)的支持。详情请参阅http://software.intel.com/en-us/articles/c99-support-in-intelr-c-compiler/?wapkw=c+compiler+c99 - Agnius Vasiliauskas
2
还有一点有趣的是,英特尔编译器的非商业版本仅适用于Linux - Agnius Vasiliauskas
Visual Studio在其最新版本中增加了对C99的一些支持,并宣布将在下一版本中添加更多支持。该答案的最后一句话已过时。 - Étienne
显示剩余3条评论

16

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

C99中我不使用的功能,因为它们得不到很好的支持,包括:

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

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

  • stdint.h
  • snprintf() - MS有一个非标准的_snprintf(),有严重的限制,不能始终在缓冲区中添加空字符并且不指示缓冲区应该有多大

为了解决Microsoft的不支持,我使用来自MinGW的公共领域的stdint.h(我修改了VC6上也能工作),以及来自Holger Weiss的几乎公共领域的snprintf()

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

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

是的 - VS2010添加了一些被纳入C++0x的C99内容,其中stdint.h是更重要的补充之一。 - Michael Burr
VS2013支持混合声明和代码,而snprintf计划在Visual Studio的下一个版本中推出。 - Étienne

7

对于gcc编译器,有一个包含所有支持特性的表格。看起来最大的缺失是可变长度数组。大多数其他缺失的特性都是库问题而不是语言特性。


自 GCC 4.5 起,完全支持可变长度数组(VLA)。 - Étienne

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

必须有像GNU中的-std=c99一样的选项。 - osgx
2
@osgx 是的,那是正确的:你可以使用选项-qlanglvl=stdc99 作为例子。 - frankster

4
请查看GNU对C99的支持情况,了解当前支持哪些功能。
据称Sun Studio支持整个C99规范。我从未使用过它们,因此无法确认。
我不认为微软编译器完全支持C99规范。他们目前更专注于C++。

3

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


3
微软似乎在跟踪C++标准,但不支持C99。(他们可能会挑选一些功能,但可以说是在重叠处挑选C++0x。)
从Visual Studio .NET 2003开始,新项目默认启用“将C代码编译为C++(/TP)”选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接