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

我已经开始对codechef进行编程练习, 并被 C和C99之间差异弄糊涂了 C是什么意思? 是C89吗? 检查提交底部的语言。 它包含C和C99。

我在网上find一些叫做GNU C的东西。对于linux / unix系统有没有不同的C语言? 这些标准是否符合ANSI的C标准? 我也在一些地方读过“C99严格”。 这是什么?

还有其他的C标准吗? 有没有什么叫做C 4.3.2,还是现在使用的gcc版本?

编辑:

这 , 这个 ,帮助。 我会search更多,并编辑没有答案的东西。

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

  • 标准化之前的一切通常被称为“K&R C”,在着名的书籍之后 ,与C语言的发明者Dennis Ritchie一起作为作者之一。 这是1972 – 1989年的“C语言”。

  • 第一个C标准是1989年在美国国家标准学会ANSI发布的。 这个版本被称为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“拥有”C语言,通过ISO 9899标准。

  • 在1999年,C标准进行了修订,许多事情发生了变化(ISO 9899:1999)。 该版本的标准称为C99。 从1999年到2011年,这是“C语言”。 大多数C编译器仍然遵循这个版本。

  • 在2011年,C标准再次发生了变化(ISO 9899:2011)。 这个版本被称为C11。 这是目前“C语言”的定义。


“C99严格”可能是指编译器设置迫使编译器遵循该标准的字母。 C标准中有一个术语符合实现 。 本质上它意味着:“这个编译器实际上正确地实现了C语言”。 正确实施C语言的程序被正式称为严格符合程序

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

如果你想按照C标准编译你的程序,你应该inputgcc -std=c99 -pedantic-errors 。 如果您的GCC版本支持,请将c99replace为c11。

  • ANSI C:第一个C语言在1989年被称为ANSI的机构标准化,这就是为什么它被称为C89。

  • C99:
    根据开发人员的要求,在1999年至2000年期间,进一步的或额外的关键字和特征已经被包含在C99中(例如:inline,boolean ..增加了浮点数字库function)

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

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

我必须对ANSI C做出回应。虽然ANSI没有做任何事情,但是编译器仍然依靠它。 例如PIC XC16编译器:“编译器是一个完全validation的编译器,它符合ANSI规范(ANSI x3.159-1989)定义的ANSI C标准,并在Kernighan和Ritchie的The C Programming Language(第二版)中进行了描述。 …“并不是所有的编程都是针对像PC这样的”大“计算机。 为您的设备编写一个编译器成本,并validation成本时间&$。 ANSI C在您的embedded式/实时设备中生存和生活。

除了Lundin 答案

丹尼斯·里奇在被问及时要说些什么

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

为什么K&R在编写K&R第二版之前没有等待最终的ANSI标准? 看起来这本书只会是几个月前的正确标准,才会被最终的ANSI标准所覆盖。 我知道在这个晚期阶段可能没有什么大的变化,但是为什么不等几个月,确保你100%的正确,而不是立即写出第三版或者过时?

我们认为这将是很好的纪念第一版10周年。 更严重的是,去年夏天我们开始工作了,因为那时候我们有时间和倾向,看来X3J11已经接近尾声。 在十二月和一月,我们正在完成,我们考虑是否有可能发生重大变化,拖延交付,并(在与出版商讨论此事后)决定,这是不值得等待的。 PH想要它,Brian和我都想把它从我们的议事日程中解放出来。

即使标准发生了变化,也很难想象它们的广泛程度足以保证新版本的发布。 (我们甚至准备好了,如果这种情况持续下去的话,我们还是可以应付的。)我们已经准备好在未来的印刷方面做出必要的改变,但是有理由希望它们应该是微不足道的。 X3J11的成员也非常急于完成而不令人惊讶的人, 毕竟,他们中的许多人都在为编写ANSI编译器的公司工作。

丹尼斯·里奇

这个问题没有在网上彻底search答案,无论如何,你可以看看这个:

  1. C是由Dennis Ritchie于1969年至1973年在AT&T贝尔实验室最初开发的通用编程语言。
  2. C99是ISO出版的C语言标准,1999年左右被ANSI采用。
  3. GNU C只是c89的一个扩展,而c99的一些特性也被添加了,但是整体上它与c99标准不同,所以在gcc编译时我们必须input其他答案中已经提到的-std=c99
  4. ANSI C是由ANSI发布的连续的一系列标准。