【问题标题】:What's the term *ANSI C* specifies if it used with GNU89, C89, GNU99, C99?如果它与 GNU89、C89、GNU99、C99 一起使用,*ANSI C* 指定的术语是什么?
【发布时间】:2011-07-15 21:09:56
【问题描述】:

在 Xcode IDE 中,我可以选择将 C 语言方言设置为一种

  • ANSI C
  • GNU89
  • C89
  • GNU99
  • C99
  • 编译器默认值

我理解它们的意思,除了 ANSI C。因为据我所知,ANSI C 只是 C89 或 C99 之一。但应该有它在那里的原因。 ANSI C 中规定的术语是什么?

【问题讨论】:

  • @Paul 我不这么认为。我很好奇列表中的术语 ANSI C 指定了什么。链接上的问题是关于 GNU99 和 C99 的具体区别。我修改了标题以更好地描述我的问题。
  • 你能找出 xcode 实际传递给 gcc 的“ANSI C”与“C89”的编译器选项吗?然后我们可以单独参考GCC来回答,这对于我们这些从未使用过xcode的人来说会更容易。通常,“ANSI C”是指 ANSI C89 或 ISO C90,这两个出版物在功能上应该是相同的,但在例如两者之间的分页,但并不一定意味着 xcode 对两者的含义相同。
  • 这假设它使用 gcc,而不是 clang。无论如何,如果我不得不猜测,我猜“C89”的意思是-std=c89,而“ANSI C”的意思是-std=c89 -pedantic,因为这是我能想到的最有用的区别,而且名称完全不合适。
  • @Steve:不是这个意思。方言选择框实际上显示了每个选项在 GCC 标志方面的含义:dl.dropbox.com/u/14571816/xcodelang.png

标签: c xcode option ansi dialect


【解决方案1】:

C 是在 70 年代“出生”的。

1978 年,Brian Kernighan 和 Dennis Ritchie 出版了这本书。本书(第 1 版)中描述的语言现在称为“K&R C”。

1988 年左右,出版了第二版。第 2 版与 ANSI (ISO) 标准非常非常相似,是人们在提到本书时通常谈论的版本:)

编译器编写者开始对语言进行更改,为了使其标准化,ANSI 于 1989 年发布了标准(C89 标准或 ANSI C)。紧随其后的是 ISO 标准 (C90),它对 ANSI 几乎没有任何改变。

1999 年,ISO 发布了另一个 C 标准:我们称之为 C99。

所以,如果我是对的,ANSI C 仅流行了几个月,但 ANSI C 和 ISO C90 之间的差异很小。事实上,今天的许多编译器都是针对带有附加功能的 ANSI C 的编译器(而不是带有附加功能但没有一些东西的 ISO C99)

【讨论】:

  • 对,但 ISO C90 不是该列表中的选项。我的猜测是 ANSI C 在这种情况下是 C89 的同义词。 en.wikipedia.org/wiki/ANSI_C
  • 那么...我们能否得出结论,ANSI C 表示 C89,而 Xcode IDE 搞砸了?
  • C89和C90有区别吗?我的理解是根本没有技术差异,但我可能是错的。
  • @James - 在 C 语言规范方面,C89 或 C90 之间没有区别。标准文档(ANSI C89 和 ISO C90)在章节编号方式上有所不同。
  • 在 GCC 文档中,选项 -ansi-std=c90 等效,并且在 -std 标志中指定的 c89c90 等效。所以我相信 GCC 会平等地处理-ansi-std=c89-std=c90
【解决方案2】:

编译器有他们所针对的语言的配置文件,就像 pmg 在他的回复中所说的那样,ANSI C 是最早的配置文件之一,在 K&R 书中有所描述。

有趣的问题是,为什么编译器要维护一个遗留语言配置文件列表?因为,根据 ANSI C 配置文件编写代码可以有力地保证您的代码几乎可以与任何编译器(更重要的是编译器版本)一起使用。

当软件项目声称与 ANSI-C 兼容时,它们是在告诉您它可以在任何地方进行编译。 Lua 的源代码就是一个例子。

【讨论】:

  • +1 用于兼容性描述。我曾经担心兼容性,现在我得到了答案:)
【解决方案3】:

edit 感谢 @Nicholas Knight 从 XCode 的 C 方言选择窗口发布截图:http://dl.dropbox.com/u/14571816/xcodelang.png

ANSI C 在历史上指的是 ANSI C89 标准(实际上与 C90 相同)。 XCode 使用 GCC 的一个版本作为编译 C 代码的编译器后端,所以我认为这是他们从中获得这些“选项”的地方,因为您可以指定 -ansi 标志或各种 std= 标志来选择模式C 编译器后端应该用于编译您的代码。

所以如果你传递-ansi,并使用C编译器,它就相当于-std=c90,也相当于-std=c89-std=iso9899:1990

-ansi

在 C 模式下,这相当于 -std=c90。在 C++ 模式下,相当于 -std=c++98.

如果您使用-std 标志,您可以传递某些值来激活不同的语言功能。

-std=

确定语言标准。目前仅在编译 C 或 C++ 时支持此选项。


这些参数是等价的:

c90

c89

iso9899:1990 支持所有 ISO C90 程序(某些与 ISO C90 冲突的 GNU 扩展被禁用)。与 C 代码的 -ansi 相同。


这些参数是等价的:

iso9899:199409 修正 1 中修改的 ISO C90。


以下这些参数是等价的:

c99

c9x

iso9899:1999

iso9899:199x

ISO C99。请注意,该标准尚未得到完全支持;看 http://gcc.gnu.org/gcc-4.5/c99status.html 了解更多信息。 c9x的名字 和 iso9899:199x 已弃用。


以下这些参数是等价的:

gnu90

gnu89

ISO C90 的 GNU 方言(包括一些 C99 功能)。这是 C 的默认值 代码。


以下这些参数是等价的:

gnu99

gnu9x

ISO C99 的 GNU 方言。当 ISO C99 在 GCC 中完全实现时,这将 成为默认值。名称 gnu9x 已弃用。

【讨论】:

    【解决方案4】:

    假设您实际上使用 GCC 作为编译器,ANSI 和 C89 是同一事物的别名。见:

    http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options

    我不确定为什么 Apple 会做出设计决定同时展示它们。 GCC 中没有实际区别。如果 -ansi 的含义在 GCC 的更高版本(可能是 C99)中发生变化,他们可能会偏执。

    【讨论】:

    • 选择作为参考文档链接的答案。 Xcode 使用 GCC 或 Clang,而 Clang 接受 GCC 选项。所以现在我可以确定 ANSI C 表示 ANSI C89,它与 ISO C90 等价。在我看来,Apple 没有认真考虑就做出了这个选择。
    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 2010-10-03
    • 2011-07-15
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2012-08-09
    相关资源
    最近更新 更多