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=c99gcc -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) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C99 常量值传递

iOS错误汇总 Implicit declaration of function - C99 完美解决

c89和c99中/运算符和%运算符为负数时的区别

范围和链接有啥区别?

xcode在用clang编译cairo库的时候出现的error和warning

C99 inline关键字