今天的编译器支持C99标准的普遍性如何?据我所知,即使GCC完全支持它。这是对的吗?
C99的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器能够理解我?
答案 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)”选项。