在 Xcode IDE 中,我可以选择将 C 语言方言设置为
- ANSI C
- GNU89
- C89
- GNU99
- C99
- 编译器默认值
我理解它们的意思,除了 ANSI C。因为据我所知,ANSI C 只是 C89 或 C99 之一。但应该有它在那里的原因。ANSI C在那里规定的术语是什么?
编辑信用转到@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
or -std=iso9899:1990
。
-ansi
在 C 模式下,这相当于
-std=c90
. 在 C++ 模式下,它相当于-std=c++98
.
如果您使用-std
标志,您可以传递某些值来激活不同的语言功能。
-std=
确定语言标准。当前仅在编译 C 或 C++ 时支持此选项。
这些参数是等价的:
c90
c89
iso9899:1990
支持所有 ISO C90 程序(某些与 ISO C90 冲突的 GNU 扩展被禁用)。与-ansi
C 代码相同。
这些参数是等价的:
iso9899:199409
ISO C90 在修正案 1 中进行了修改。
以下这些参数是等效的:
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 已弃用。
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)
编译器有他们所针对的语言的配置文件,就像 pmg 在他的回复中所说的那样,ANSI C 是最早的配置文件之一,在 K&R 书中有所描述。
有趣的问题是,为什么编译器要维护一个遗留语言配置文件列表?因为,根据 ANSI C 配置文件编写代码可以有力地保证您的代码几乎可以与任何编译器(更重要的是编译器版本)一起使用。
当软件项目声称与 ANSI-C 兼容时,它们是在告诉您它可以在任何地方进行编译。Lua 的源代码就是一个例子。
事实上,假设您使用 GCC 作为编译器,ANSI 和 C89 是同一事物的别名。看:
http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options
为什么苹果做出设计决定同时展示它们,我不确定。GCC 中没有实际区别。如果 -ansi 的含义在 GCC 的更高版本(可能是 C99)中发生变化,他们可能会偏执。