C、C99、ANSI C和GNU C之间有什么区别?

vuktfyat  于 2023-10-16  发布在  其他
关注(0)|答案(5)|浏览(192)

我已经开始在codechef上进行编程实践,并被C和C99之间的**差异所迷惑。C在这里是什么意思?它是C89吗?**检查this submit底部的语言。它含有C和C99。
我在网上找到了一个叫GNU C的东西。Linux/Unix系统有不同的C吗?这些是否符合ANSI的C标准?我也读过一些地方的“C99严格”。这是什麽?
是否有其他不同的C标准在使用?是不是有一个叫C 4.3.2的东西,或者是目前使用的gcc版本?
编辑:
ThisThisThis帮助。我会搜索更多的东西,并编辑那些没有回答的问题。
我不是编程新手。我知道什么是C语言。我知道ANSI有不同的C标准,如C89,C99和C11。

hxzsmxv2

hxzsmxv21#

  • 标准化之前的一切通常被称为“K&R C”,以著名的书(1st edition2nd edition)命名,C语言的发明者丹尼斯里奇是作者之一。这是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语言没有任何关系,除了作为ISO标准的许多示例之一。目前在美国通过INCITS完成,C标准在美国正式称为INCITS/ISO/IEC 9899。例如,在欧洲称为EN/ISO/IEC。
仍然在谈论“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或C18。它于2017年完成(并使用__STDC_VERSION__ = 201710L),但由ISO发布为9899:2018,因此C17/C18之间存在模糊性。它不包含任何新功能,只是更正。它是C语言的最新版本。
  • 一份名为“C23”/“C2 X”的草案正在由委员会进行,计划于2023年发布(但官僚机构的车轮缓慢转动,检查状态at ISO)。最后的工作草案N3096可以找到here

这包含了很多小缺陷报告修复,如C17/C18,但也有很多重大变化和新功能。这是一个重大的释放。
我在这里写了一个最有可能影响普通C程序员的变化的总结:What is C23 and why should I care?
“C99 strict”可能是指编译器设置强制编译器严格遵循标准。在C标准中有一个术语“一致性实现”。基本上它意味着:“这个编译器实际上正确地实现了C语言”。正确实现C语言的程序被正式称为严格符合程序(Strictly Conforming Programs)。此类程序也可能不包含任何形式的定义不明确的行为。
“GNU C”可以指两件事。或者是作为GNU编译器集合(GCC)的一部分的C编译器本身。或者它可以表示GCC C编译器使用的非标准默认设置。如果你用gcc program.c编译,那么你就不是按照C标准编译,而是按照非标准的GNU设置编译,这可能被称为“GNU C”。例如,整个Linux内核都是用非标准的GNU C编写的,而不是用标准的C编写的。
如果你想根据C标准编译你的程序,你应该输入gcc -std=c99 -pedantic-errors。如果你的GCC版本支持c17,用c99替换它。

展开查看全部
mzmfm0qo

mzmfm0qo2#

关于ANSI C的问题,我必须回答。虽然ANSI没有对它做任何事情,但编译器仍然是针对它构建的。PIC XC 16编译器举例:编译器是一个完全验证的编译器,符合ANSI规范(ANSI x3.159-1989)定义的ANSI C标准,并在Kernighan和里奇的《C编程语言》(第二版)中进行了描述。并不是所有的编程都是为像PC这样的“大”计算机而设计的。为你的设备编写一个编译器需要花费很多时间,验证需要花费很多钱。ANSI C在你的嵌入式/实时设备中仍然存在。

7nbnzgx9

7nbnzgx93#

  • 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编译器集合)编译代码.它有C库函数,定义系统调用,如malloc,calloc,exit等

ANSI C是一个被其他标准使用或引用的标准。

kqqjbcuj

kqqjbcuj4#

关于Lundin Answer
这是丹尼斯·里奇在被问到时要说的话

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

我们觉得纪念第一版10周年会很好。更严重的是,我们去年夏天开始工作,因为我们当时有时间和意愿,而且X3 J11似乎接近尾声。在12月和1月,当我们完成时,我们考虑了是否有重要变化的可能性值得推迟交付,并且(在与出版商讨论此事后)决定不值得等待。P-H想要它,布莱恩和我都想把它从我们的议程上去掉。
即使标准中有变化,也很难想象它们会广泛到足以保证新版本。(我们甚至准备以某种方式科普noalias,如果它持续的话。)我们准备在未来的打印中进行必要的修改,但有理由希望它们应该是次要的。X3 J11的成员们也非常渴望在不让人惊讶的情况下完成比赛;毕竟,他们中的许多人为准备ANSI编译器的公司工作。
丹尼斯里奇酒店

brtdzjyr

brtdzjyr5#

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

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

相关问题