C,C99,ANSI C和GNU C有什么区别?


122

我已经开始在Codechef上进行编程实践,并且对C和C99之间差异感到困惑C在这里是什么意思?是C89吗?检查此提交底部的语言。它同时包含C和C99。

我在互联网上发现了一个名为GNU C的东西。Linux / unix系统是否有其他C?这些是否符合ANSI的C标准?我在某些地方也读过“ C99严格”。这是什么?

是否还有其他使用的C标准?是否有所谓的C 4.3.2或当前使用的gcc版本?

编辑:

有所帮助。我将搜索更多并编辑未回答的内容。

我不是编程新手。我知道什么是C语言。我知道ANSI有不同的C标准,例如C89,C99和C11。


@我不会搜索太多。我现在做了。我会做的更多。并进一步编辑问题。
Aseem Bansal

@Will我是不是能够找到的有关C99严格,无论是在codechef的C是C89或较早的非标准化的原始C.
Aseem邦萨尔

1
不要忘了POSIX C :-)
pmg

Answers:


216
  • 著名的书之后,C语言的发明者Dennis Ritchie作为作者之一,在标准化之前的所有内容通常称为“ K&R C” 。这是1972-1989年的“ C语言”。

  • 第一个C标准是由其国家标准协会ANSI在1989年在美国全国发布的。此版本称为C89或ANSI-C。从1989年至1990年,这是“ C语言”。

  • 次年,美国标准被国际认可并由ISO(ISO 9899:1990)发布。此版本称为C90。从技术上讲,它是与C89 / ANSI-C相同的标准。正式地,它取代了C89 / ANSI-C,使它们过时了。从1990年到1999年,C90是“ C语言”。

    请注意,自1989年以来,ANSI与C语言没有任何关系。仍然在谈论“ ANSI C”的程序员通常对它的含义一无所知。ISO通过标准ISO 9899“拥有” C语言。

  • 1995年发布了一个较小的更新,有时称为“ C95”。这不是主要修订,而是正式命名为ISO / IEC 9899:1990 / Amd.1:1995的技术修订。主要变化是引入了广泛的字符支持。

  • 在1999年,C标准进行了重大修订(ISO 9899:1999)。该标准的版本称为C99。从1999年到2011年,这是“ C语言”。

  • 2011年,C标准再次更改(ISO 9899:2011)。此版本称为C11。各种新功能,如_Generic_Static_assert和线程支持添加的语言。该更新将重点放在多核,多处理和表达测序上。从2011年至2017年,这是“ C语言”。

  • 2017年对C11进行了修订,并解决了各种缺陷报告。该标准被非正式地称为C17,并以ISO 9899:2018的形式发布。它不包含任何新功能,而仅包含更正。它是C语言的当前版本。


“ C99严格”可能是指编译器设置,该设置强制编译器遵循字母的标准。C标准中有一个术语符合实现。从本质上讲,它的意思是:“此编译器实际上正确地实现了C语言”。正确实现C语言的程序在形式上称为严格符合程序

“ GNU C”可以表示两件事。C编译器本身是GNU编译器集合(GCC)的一部分。或它可能意味着GCC C编译器使用的非标准默认设置。如果使用进行编译,gcc program.c则不会根据C标准进行编译,而是根据非标准的GNU设置进行编译,这可以称为“ GNU C”。例如,整个Linux内核是使用非标准GNU C而不是标准C制成的。

如果要根据C标准编译程序,则应输入gcc -std=c99 -pedantic-errors。如果您的GCC版本支持,请将c99替换为c11。


8
严格的编译器设置可能表示“禁用扩展;只能使用“标准定义的C语言”,也不能使用“正确编译”。接受对语言的扩展是完全正确的;该标准被定义为允许这样做。
Eric Postpischil 2013年

5
C94 / C95修正案1主要增加了更广泛的字符支持。另请参见C和C ++中的标准头文件列表
Jonathan Leffler 2013年

2
您写的很多东西都从C90变为C99。你能列举几个吗?
Martin Thoma 2014年

3
@Lundin,您将K&R的书联系错了;这是描述C89标准的第二版。
Antti Haapala'Feb 22'15

5
是的,但要点是,到目前为止,还没有定义C编程语言的版本。不是说它会在任何地方出售。
Antti Haapala'Feb 23'15

7

我必须对ANSI C做出回应。尽管ANSI并没有做任何事情,但编译器仍然是基于ANSI C的。例如,PIC XC16编译器:“该编译器是经过完全验证的编译器,符合ANSI规范(ANSI x3.159-1989)定义的ANSI C标准,并且在Kernighan和Ritchie的The C Programming Language(第二版)中进行了描述。 ...“并非所有编程都针对PC等“大型”计算机。为您的设备编写编译器成本,并验证成本和时间。ANSI C可以在您的嵌入式/实时设备中正常运行。


4
  • ANSI C:1989年,第一个C语言被ANSI标准化,这就是为什么它被称为c89的原因。

  • C99:
    根据开发人员的需求,在1999-2000年,C99中进一步包含了其他关键字或功能(例如:内联,布尔值。添加了浮点关节库功能)

  • GNU C:GNU是一个像操作系统(www.gnu.org)一样的Unix,而GNU的项目则需要基于ANSI C标准的C编程语言。GNU使用GCC(GNU编译器集合)编译器来编译代码。它具有C库函数,该函数定义系统调用,例如malloc,calloc,exit ... etc

ANSI C是其他标准正在使用或引用的标准。


有关C99严格的信息,以及codechef中的C是C89还是更早的非标准化原始C
Aseem Bansal 2013年

更正:ANSI C是过时的标准,仅由过时的文档引用。C语言称为ISO C,如果您使用ISO / IEC 9899:2011,则称为C语言。
伦丁

1

除了伦丁答案

这是丹尼斯·里奇有什么要 当问

“为什么在编写K&R第二版之前,K&R为什么不等待最终批准的ANSI标准?”

为什么在编写K&R第二版之前,K&R不等待最终批准的ANSI标准?看来这本书只有几个月才能成为正确的标准,然后才被最终的ANSI标准取代。我知道在这个后期阶段可能不会有什么大的变化,但是为什么不等上几个月并确保100%正确,而不是几乎立即编写第3版或作废呢?

我们认为很高兴纪念第一版的十周年。更严重的是,我们从去年夏天开始工作,因为那时我们有时间和倾向,看来X3J11快要结束了。在即将完成的12月和1月,我们考虑了是否可能需要进行重大更改来推迟交货,并且(在与发布商讨论此事之后)认为这不值得等待。PH想要它,而Brian和我都希望它不在我们的议程之列。

即使标准有所更改,也很难想象它们会足够广泛以至于需要新版本。(如果它持续了,我们甚至准备好应对noalias。)我们准备在将来的印刷中进行必要的更改,但是我们有理由希望它们应该很小。X3J11的成员也非常渴望在没有令人惊讶的情况下完成任务。毕竟,它们中的许多都为正在准备ANSI编译器的公司工作。

丹尼斯·里奇


1
太糟糕的是,丹尼斯·里奇(Dennis Ritchie)没意识到如何使用别名规则来暗示编译器不应做出任何努力来识别有用的别名形式,而是辩称其代码被钝的编译器破坏的程序员应该“感谢”编译器以向他们显示他们的代码“有缺陷”-否则他本可以告诉人们推动这些规则,以明确表明拒绝支持超出标准最低要求的别名将使编译器不适合某些用途,而低级代码对别名的需求则是不是缺陷。
超级猫

@supercat我实际上不明白什么是别名规则,您可以帮我什么忙吗?
Suraj Jain

1
最初的概念是,在可能包含地址的偶然写入后,int i; int test(double *p) { i=1; *p=2.0; return i; }不需要重新加载像编译器这样的给定代码。完全合理。问题在于,即使两种类型的大小和表示形式相同,现代编译器也使用相同的规则来证明写入a 不会影响a的假设,并且即使两个结构共享一个Common Initial Sequence,代码也永远不会使用一种类型的指针,以读取通过另一种类型写入的CIS成员。i*ppilong*long long
超级猫

-2

没有在网上彻底搜索这个问题的答案,反正您可能会这样看:

  1. C是一种通用编程语言,最初由Dennis Ritchie在1969年至1973年之间由AT&T贝尔实验室开发。
  2. C99是由ISO发布并由ANSI在1999年左右采用的C语言标准。
  3. GNU C只是c89的扩展,同时还添加了c99的某些功能,但是整体上它与c99标准不同,因此在gcc中进行编译时,我们必须输入-std=c99在其他答案中已经提到的内容。
  4. ANSI C是ANSI发布的一系列连续标准。

我现在在网上搜索。我编辑了问题。在发布问题之前,我了解C和ANSI标准。我对特定的事情感到困惑。我会尝试更加精确。
Aseem Bansal

有关C99严格的信息,以及codechef中的C是C89还是更早的非标准化原始C
Aseem Bansal 2013年

4
该答案包含许多错误。C99是由ISO于1999年左右定义的标准。C语言已经国际标准化23年了。因此ANSI 与它无关,他们已经24年没有接触C标准了。如今,他们只是为美国市场印刷和分发ISO标准。
伦丁

@伦丁哦!是的,实际上我写的不是“ defined”,应该在此处“采用”。我进行了更正,ANSI早在1989年就发布了C方式的第一个标准,该标准被ISO采纳。此后几乎所有标准是由ISO发布并由ANSI采用的,答案是简短的,因此我只说了几句话,使答案简短。
0decimal0

1
请注意,gcc支持-std=c89and -std=gnu89-std=c99and -std=gnu99(以及足够新的版本支持-std=c11and -std=gnu11)。区别在于对标准C的扩展是自动可用的,或者仅在源代码促使编译器向其提供适当的宏(例如-D_XOPEN_SOURCE=700)时才可用。
Jonathan Leffler 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.