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

Ase*_*sal 115 c gcc c99 c89 ansi-c

我已经开始编写关于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.

Lun*_*din 198

  • 标准化之前的一切通常被称为"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通过标准ISO 9899"拥有"C语言.

  • 1995年发布了一个小的更新,有时称为"C95".这不是一个重大修订,而是一个正式命名为ISO/IEC 899: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 strict"可能是指编译器设置强制编译器遵循该字母的标准.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.

  • 严格的编译器设置可能意味着"禁用扩展; 仅使用标准定义的C语言"以及,或者更多,"正确编译".接受语言的扩展是完全正确的; 该标准被定义为允许这样做. (7认同)
  • 还有C94/C95修正案1主要增加了更广泛的人物支持.另请参见[C和C++中的标准头文件列表](http://stackoverflow.com/questions/2027991/list-of-standard-header-files-in-c-and-c/). (5认同)
  • 是的,但重点是,这不是定义C编程语言的版本; 并不是说它会在任何地方发售. (5认同)
  • @Lundin你把错误的书与K&R挂钩; 这是描述C89标准的第二版. (3认同)
  • 你写的很多东西从C90改为C99.你能说点几个吗? (2认同)

小智 7

我必须回应ANSI C.尽管ANSI没有对它做任何事情,编译器仍然是为它构建的.例如,PIC XC16编译器:"编译器是一个完全验证的编译器,符合ANSI规范(ANSI x3.159-1989)定义的ANSI C标准,并在Kernighan和Ritchie的C编程语言(第二版)中有所描述. ......"并非所有编程都适用于PC等"大型"计算机.为您的设备成本编写编译器,并验证成本时间和$.ANSI C在您的嵌入式/实时设备中充满活力.


Sur*_*ain 6

除了伦丁的回答之外

以下是丹尼斯·里奇 在被问及时所说的话

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

为什么 K&R 不在编写 K&R 第二版之前等待最终批准的 ANSI 标准?看起来这本书只会在几个月内成为正确的标准,然后就会被最终的 ANSI 标准取代。我知道在这个后期阶段可能不会有什么重大变化,但为什么不等几个月并确保你得到它 100% 正确,而不是需要几乎立即编写第三版或被过时呢?

我们认为庆祝第一版发布 10 周年会很高兴。更严重的是,我们去年夏天就开始工作,因为当时我们有时间和意愿,而且X3J11似乎已经接近尾声了。12 月和 1 月,当我们即将完成时,我们考虑了重要变更的可能性是否需要推迟交付,并且(在与出版商讨论此事后)认为不值得等待。希盟想要它,布莱恩和我都希望把它从我们的议程中剔除。

即使标准发生变化,也很难想象它们的范围足以保证推出新版本。(我们甚至准备以某种方式应对 noalias,如果它持续的话。)我们准备在未来的印刷中进行必要的更改,但有理由希望它们应该是较小的。X3J11的成员们也非常渴望完成任务,不让人们感到惊讶;毕竟,他们中的许多人都为正在准备 ANSI 编译器的公司工作。

丹尼斯·里奇

  • 不幸的是,丹尼斯·里奇(Dennis Ritchie)没有意识到如何使用别名规则来暗示编译器不应该做出“任何”努力来识别有用的别名形式,而是认为代码被迟钝的编译器破坏的程序员应该“感谢”编译器向他们展示他们的代码是“有缺陷的”——否则他本可以告诉推动此类规则的人们,以明确拒绝支持超出标准最低要求的别名将使编译器不适合某些用途,并且低级代码需要混叠不是缺陷。 (3认同)
  • 最初的概念是给定像“int i;”这样的代码。int 测试(双*p) { i=1; *p=2.0;返回我;如果“p”可能保存“i”的地址,则不应要求编译器在写入“*p”后重新加载“i”。完全合理。问题是现代编译器使用相同的规则来证明写入“long*”不会影响“long long”的假设,*即使两种类型具有相同的大小和表示*,并且即使两个结构共享公共初始序列,代码永远不会使用一种类型的指针来读取通过另一种类型写入的 CIS 成员。 (3认同)

小智 5

  • ANSI C:第一种C语言由1989年称为ANSI的机构标准化,这就是为什么它被称为c89.

  • C99:
    根据开发人员的要求,在1999 - 2000年,C99中还包含了其他关键字和功能(例如:inline,boolean ..添加了浮点运算库函数)

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

ANSI C是其他标准使用或参考的标准.