【问题标题】:How universally is C99 supported?C99 的支持范围有多广?
【发布时间】:2010-09-13 11:02:31
【问题描述】:

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

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

【问题讨论】:

  • 别忘了图书馆。除了漂亮的语法(比如命名的结构初始化器),C99 还添加了许多有用的数学库函数,比如 long lrtint(double);它会进行快速舍入操作,否则您必须像 (long)(x + 0.5) 一样破解。
  • 波特兰集团的高性能 PGCC 编译器 100% 符合 C99。

标签: c c99 standards-compliance


【解决方案1】:

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

【讨论】:

  • 自 gcc 4.5 起完全支持 VLA。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果您想编写可移植的 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 前端)支持除浮点编译指示以外的大多数功能。

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

    【讨论】:

    • ANSI C 是指 C89/C90 吗?因为ANSI C和ISO C曾经是同义词,但我明白现在ISO C指的是C99
    • GCC 4.5 最终将可变长度数组列为 Done 而不是 Broken
    • @kaizer.se :感谢您告诉我们。
    • -1。英特尔没有完全支持 c99。缺少long double's
    • 另外有趣的是,英特尔编译器的非商业版本是only available for Linux
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      由于没有得到很好的支持,我不使用的 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() - 这使得编译指示更有用

      【讨论】:

      • 是的 - VS2010 添加了一些已合并到 C++0x 中的 C99 内容。 stdint.h 是更重要的补充之一。
      • VS2013 支持混合声明和代码,snprintf 计划在 Visual Studio 的下一个版本中。
      【解决方案6】:

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

      【讨论】:

      • 必须有类似gnu的选项-std=c99
      • @osgx 是的,这是正确的:例如,您可以使用选项 -qlanglvl=stdc99
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2021-10-10
        • 2016-09-29
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多