【问题标题】:What's the difference between GNU99 and C99 (Clang)?GNU99 和 C99 (Clang) 有什么区别?
【发布时间】:2011-07-15 20:57:21
【问题描述】:

我看到了编译器选项 GNU99 和 C99。他们有什么区别?有详细的文档吗? (Clang、Xcode、Mac OS X)

【问题讨论】:

  • 从上下文来看,我假设您在谈论 gcc。例如,icc -std=c99gcc -std=c99 是非常不同的。
  • @user510306: "(Clang, Xcode, Mac OS X)"

标签: c compiler-construction option clang


【解决方案1】:

Differences between various standard modes

clang 支持 -std 选项,它改变了 clang 使用的语言模式。 C 支持的模式是 c89、gnu89、c94、c99、gnu99 和这些模式的各种别名。如果没有指定 -std 选项,clang 默认为 gnu99 模式。

所有 c* 和 gnu* 模式的区别:

  • c* 模式定义__STRICT_ANSI__
  • 不带下划线前缀的目标特定定义,如“linux”,在 gnu* 模式下定义。
  • 在 gnu* 模式下,Trigraphs 默认关闭;它们可以通过-trigraphs 选项启用。
  • 解析器将“asm”和“typeof”识别为 gnu* 模式中的关键字; __asm____typeof__ 变体可在所有模式下识别。
  • 在某些平台上的 gnu* 模式下默认识别 Apple “blocks” 扩展;可以使用-fblocks 选项在任何模式下启用它。

更多链接

【讨论】:

    【解决方案2】:

    C99 是直接的 C99,GNU99 是带有 gnu 扩展的 C99。请参阅GCC manpage

    【讨论】:

    • @Rob:它确实既是子集又是超集,因为它显然缺少一些 C99 功能,但它也有 GNU 扩展。
    【解决方案3】:

    C99 只是我们都知道的 1999 年 C 标准的版本。在 GCC 中不完全支持它。

    GNU99 是 C99 的扩展,就像 GNU98 是 C98 的扩展一样。来自文档:

    ISO C99 加上 GNU 扩展。当 ISO C99 在 GCC 中完全实现时,这将成为默认设置。名称 gnu9x 已弃用。

    Clang 也支持这些扩展。

    【讨论】:

    • 我发现了一些东西。这是你要提的吗? gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions
    • 这个列表已经过时了;列表中的许多内容不是扩展,而是 12 年前标准 C 语言的一部分。
    • @R.. Eonil 的评论页面还说,某些扩展确实是标准的一部分。因此,如果您这样看,它不会过时。
    • 它仍然使列表对于回答 OP 的问题毫无用处。
    • 抱歉,gnu99 是 c99 的子集,目前缺少的内容请参见 gcc.gnu.org/c99status.html
    猜你喜欢
    • 2012-12-01
    • 2013-06-16
    • 1970-01-01
    • 2013-08-06
    • 2014-09-11
    • 1970-01-01
    • 2023-03-07
    • 2010-10-03
    • 2016-04-14
    相关资源
    最近更新 更多