- ANSI C
- GNU89
- C89
- GNU99
- C99
- 编译器默认
编辑 感谢@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
GNU C90方言(包括部分C99特性)。这是C代码的默认设置。
以下参数等效:
gnu99
gnu9x
GNU C99方言。当GCC完全实现ISO C99时,它将成为默认设置。名称gnu9x已被弃用。
C语言诞生于70年代。
1978年,Brian Kernighan和Dennis Ritchie出版了这本书。该书中描述的语言(第一版)现在被称为“K&R C”。
1988年左右,出版了第二版。这个第二版与ANSI(ISO)标准非常相似,通常人们提到这本书时指的是这个版本 :)
编译器开发者开始对语言进行更改,并为了标准化它,ANSI于1989年发布了一个标准(C89标准或ANSI C)。紧随其后的是ISO标准(C90),它对ANSI几乎没有做出任何更改。
1999年,ISO发布了另一个C标准:我们所说的C99。
因此,如果我没错的话,ANSI C只流行了几个月,但ANSI C和ISO C90之间的差异很小。事实上,今天许多编译器都是带有额外功能的ANSI C编译器(而不是带有一些功能但缺少一些东西的ISO C99编译器)。
ANSI C
在这种情况下是C89
的同义词。http://en.wikipedia.org/wiki/ANSI_C - mbauman编译器具有其所针对语言的配置文件,正如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)。
-std=c89
,而“ANSI C”意味着-std=c89 -pedantic
,因为这是我所想到的最有用的区别,而名字又不完全不恰当。 - Steve Jessop-ansi
和-std=c89
是等效的。谢谢! - Steve Jessop