GNU99 和 C99 (Clang) 有啥区别?
Posted
技术标签:
【中文标题】GNU99 和 C99 (Clang) 有啥区别?【英文标题】: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=c99
和 gcc -std=c99
是非常不同的。
@user510306: "(Clang, Xcode, Mac OS X)"
【参考方案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
选项在任何模式下启用它。
更多链接
Options controlling C dialect for GCC Extensions to the C Language Family Clang Language Extensions Useful GCC flags for C【讨论】:
【参考方案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。以上是关于GNU99 和 C99 (Clang) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
iOS错误汇总 Implicit declaration of function - C99 完美解决