如果术语 *ANSI C* 与GNU89、C89、GNU99、C99一起使用,它指定了什么?

bjg7j2ky  于 2023-03-22  发布在  其他
关注(0)|答案(4)|浏览(248)

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

  • 美国国家标准协会C
  • GNU89
  • C89
  • GNU99
  • C99
  • 编译器默认值

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

0sgqnhkj

0sgqnhkj1#

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
时支持此选项。
这些参数是等效的:
x1米11米1x
c89
iso9899:1990支持所有ISO C90程序(某些与ISO C90冲突的GNU扩展被禁用)。与C代码的-ansi相同。
这些参数是等效的:
iso9899:199409 ISO C90,如修正案1所述。
以下参数是等效的:
c99
c9x
iso9899:1999
iso9899:199x
ISO C99。请注意,尚未完全支持此标准;请参阅http://gcc.gnu.org/gcc-4.5/c99status.html了解更多信息。名称c9 x和iso 9899:199 x已弃用。
以下参数是等效的:
x1米20英寸1x
gnu89
ISO C90的GNU方言(包括一些C99特性)。这是C代码的默认值。
以下参数是等效的:
gnu99
gnu9x
ISO C99的GNU方言。当ISO C99在GCC中完全实现时,这将成为默认值。名称gnu 9 x已被弃用。

mwg9r5ms

mwg9r5ms2#

编译器有他们所针对的语言的配置文件,就像pmg在他的回复中说的那样,ANSI C是最早的配置文件之一,在K&R书中描述的那个。
有趣的问题是,为什么编译器要维护一个遗留语言配置文件的列表?因为,根据ANSI C配置文件编写代码是一个相当强的保证,你的代码将与几乎任何编译器(更重要的是编译器版本)一起工作。
当软件项目声称ANSI-C兼容时,他们告诉你它可以在任何地方编译,Lua的源代码就是一个例子。

b5buobof

b5buobof3#

C是在70年代“出生”的。
1978年,Brian Kernighan和Dennis里奇出版了这本书,书中描述的语言现在被称为“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的编译器,带有额外的东西,但没有一些东西)

falq053o

falq053o4#

假设你实际上使用GCC作为编译器,ANSI和C89是同一个东西的别名。请参阅:
http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options
我不知道苹果为什么要设计出这两种语言。GCC中没有实际的区别。也许他们是偏执狂,以防-ansi的含义在GCC的后续版本(可能是C99)中发生变化。

相关问题