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

我已经开始编程实践的 厨师长和一直困惑的 C 和 C99的区别。 C 在这里是什么意思? 是 C89吗?检查在 提交底部的语言。它包含 C 和 C99。

我在互联网上发现了一个叫 GNU C 的东西,linux/unix 系统有没有不同的 C?这些是否符合 ANSI 的 C 标准?我也在一些地方读到过“ C99严格”。这是什么?

还有其他不同的 C 语言标准吗?是否有一个叫做 C4.3.2的东西,或者它是目前使用的 gcc 版本?

编辑:

这个 这个这个帮助。我将搜索更多并编辑那些没有回答的东西。

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

99321 次浏览

这个问题在网上并没有被彻底搜索到答案,不管怎样,你可以看看这个:

  1. 通用编程语言最初是由 丹尼斯 · 里奇1969年至1973年在 AT & T 贝尔实验室工作。
  2. C99是国际标准化组织(ISO)发布的 C 语言标准,于1999年左右被美国国家标准化组织(ANSI)采用。
  3. GNU C 只是 c89的一个扩展,虽然 c99的一些特性也被添加了,但是总的来说它不同于 c99标准,所以当我们在 gcc 中编译时,我们必须输入 -std=c99,这在其他的答案中已经提到了。
  4. ANSI C 是由 ANSI 发布的一系列连续的标准。
  • ANSI C: 第一个 C 语言在1989年被称为 ANSI 的机构标准化,这就是为什么它被称为 c89

  • C99:
    根据开发人员的要求,在1999-2000年度,C99增加了额外的关键字和功能(例如:。.增加了浮点数专题库函数)

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

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

  • 在标准化之前的所有东西通常都被称为“ 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 语言没有任何关系,除了作为许多实例之一在 ISO 标准上工作。目前在美国通过 INCITS实现,C 标准在美国的正式名称为 INCITS/ISO/IEC 9899。正如它在欧洲被称为 EN/ISO/IEC 一样。

    程序员仍然在谈论“ ANSI C”,通常不知道它是什么意思。ISO 通过 ISO9899标准“拥有”C 语言。

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

  • 1999年,C 标准经历了一次重大修订(ISO9899:1999)。这个版本的标准叫做 C99。从1999年到2011年,这就是“ C 语言”。

  • 2011年,C 标准再次改变(ISO9899:2011)。这个版本叫做 C11。该语言增加了诸如 _Generic_Static_assert和线程支持等各种新特性。更新的重点是多核、多处理和表达式排序。从2011年到2017年,这是“ C 语言”。

  • 2017年,C11进行了修订,解决了各种缺陷报告。这个标准非正式地称为 C17或 C18。它于2017年完成(并使用 __STDC_VERSION__ = 201710L) ,但由 ISO 发布为9899:2018,因此 C17/C18之间存在模糊性。它不包含任何新特性,只是更正。它是 C 语言的当前版本。

  • 委员会正在起草一份名为“ C23”/“ C2X”的草案,计划于2023年发布。当前的工作草案可以找到 给你,在这一点上称为 N2731,最后修改2021-10-18。

    这包含了很多次要的缺陷报告修复,比如 C17/C18,但是也有一些主要的变化,最值得注意的(到目前为止) :

    • 去掉奇异的符号性表示,使之有利于强制性2的补语
    • 最终删除“ K & R 风格”函数定义(标记自 C99以来已过时)
    • 增加了一些新的功能,包括 memccpystrdup
    • 来自 C + + deprecatedfallthroughmaybe_unusednodiscard的一些新的函数属性
    • 用于整数常量的二进制 0b表示法(目前没有作为对 N2731的修改之一列出,但在草案的第51页中有提及)。

“ C99严格”可能是指编译器设置迫使编译器按字母顺序遵循标准。在 C 标准中有一个术语 符合执行规定。本质上它的意思是: “这个编译器实际上正确地实现了 C 语言”。正确实现 C 语言的程序正式称为 严格遵守程序。这样的程序也可能不包含任何形式的定义不明确的行为。

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

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

我必须回应关于 ANSI C。虽然 ANSI 没有做任何事情与它,编译器仍然构建到它。例如,PIC XC16编译器: ”编译器是一个完全经过验证的符合 ANSI C 的编译器 根据 ANSI 规范(ANSI x3.159-1989)和 在 Kernighan 和 Ritchie 的 C 编程语言(第二 ...” 并非所有的编程都适用于像 PC 这样的“大”计算机。为你的设备编写一个编译器需要花费时间和金钱。ANSI C 还活着,很好 生活在你的嵌入式/实时设备中。

除了 Lundin 回答我

以下是丹尼斯 · 里奇在被问及 时的回答

“为什么 K & R 不等到最终通过 ANSI 标准后再编写 K & R 第二版?”

为什么 K & R 不等到最终通过 ANSI 标准后再写呢 K & R 第二版? 看起来这本书只会是 几个月后它将被最终的 ANSI 标准所取代,我知道 在这个后期阶段可能不会有什么重大变化,但是为什么不呢 等待几个月,确保你100% 正确,而不是需要 几乎立刻写出第三版还是被淘汰

我们觉得庆祝结婚十周年挺好的 第一版。 更严重的是,我们去年夏天开始工作,因为我们有 时间和倾斜,看来 X3J11正在接近 在十二月和一月,当我们结束的时候,我们考虑 重大变革的可能性是否值得推迟 (与出版商讨论此事后) 决定这不值得等待。 P-H 想要它,而且两者 布莱恩和我不想再提这件事了。

即使标准发生了变化,也很难想象 它们的广度足以保证一个新版本的出现。 (我们甚至准备以某种方式应对 Noalias,如果它能持续下去的话。) 我们已经准备好在未来的印刷中做出必要的改变, 但有理由希望他们应该是小型的。 X3J11的 成员们也非常渴望在没有惊喜的情况下完成任务; 他们中的许多人为正在准备 ANSI 编译器的公司工作, 毕竟。

Dennis Ritchie