如果在GNU89、C89、GNU99或C99中使用*ANSI C*这个术语,它指的是什么?

4
在Xcode IDE中,我有一个选项可以将C语言方言设置为以下之一:
  • ANSI C
  • GNU89
  • C89
  • GNU99
  • C99
  • 编译器默认
我理解除了ANSI C以外的所有选项,因为我知道ANSI C只是C89或C99中的一个。但是它出现在这里肯定有原因。那么术语“ANSI C”在这里指的是什么?

1
可能是What's the difference between GNU99 and C99?的重复问题。 - Paul R
3
@Paul 我不这么认为。我很好奇列表中的术语* ANSI C *指的是什么。链接中的问题是关于GNU99和C99之间具体差异的。我修改了标题以更好地描述我的问题。 - eonil
你能找出Xcode为“ANSI C”和“C89”实际传递给GCC的编译器选项吗?然后我们就可以仅参考GCC来回答问题,这对于我们中从未使用过Xcode的人来说会更容易。通常,“ANSI C”表示ANSI C89或ISO C90,这两个出版物应该在功能上是相同的,但在页面排版等方面有所不同,但Xcode并不一定意味着两者含义相同。 - Steve Jessop
假设使用的是gcc,而不是clang。无论如何,如果我必须猜测,“C89”意味着-std=c89,而“ANSI C”意味着-std=c89 -pedantic,因为这是我所想到的最有用的区别,而名字又不完全不恰当。 - Steve Jessop
2
@Steve:这不是它的意思。方言选择框实际上显示了每个选项在GCC标志方面的含义:http://dl.dropbox.com/u/14571816/xcodelang.png - Nicholas Knight
@Nicholas:那不是我能想到的最有用的区别,因为对于GCC来说,-ansi-std=c89是等效的。谢谢! - Steve Jessop
4个回答

6

编辑 感谢@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已被弃用。


1

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编译器)。


没错,但是ISO C90不在那个列表中。我猜ANSI C在这种情况下是C89的同义词。http://en.wikipedia.org/wiki/ANSI_C - mbauman
那么...我们可以得出结论,ANSI C 意味着 C89,而 Xcode IDE 出了些问题? - SubniC
C89和C90之间有什么区别吗?我的理解是两者在技术上没有任何区别,但我可能错了。 - James McNellis
@James - 就 C 语言规范而言,C89 或 C90 之间没有任何区别。标准文档(ANSI C89 和 ISO C90)在章节编号方式上有所不同。 - wkl
在GCC文档中,选项“-ansi”与“-std=c90”等效,并且指定“c89”在“-std”标志中等效于“c90”。因此,我相信GCC将同等处理“-ansi”,“-std=c89”和“-std=c90”。 - eonil

1

编译器具有其所针对语言的配置文件,正如pmg在他的回复中所说,ANSI C是最早的配置文件之一,也是K&R书中描述的那个。

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

当软件项目声称具有ANSI-C兼容性时,它们告诉您它将在任何地方编译。Lua源代码就是一个例子。


+1 适用性描述。我曾经担心过兼容性问题,但现在我已经得到了答案 :) - eonil

0

假设您实际上正在使用GCC编译器,那么ANSI和C89是同一件事的别名。请参见:

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

为什么苹果会做出同时呈现它们的设计决策,我不确定。在GCC中没有实际区别。也许他们是因为担心-ansi的含义在以后的GCC版本中发生变化(也许是C99)。


被选为链接参考文档的答案。Xcode使用GCC或Clang,而Clang接受GCC选项。所以现在我可以确定ANSI C意味着ANSI C89,它只是等同于ISO C90。在我看来,苹果公司没有认真考虑这个选项。 - eonil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接