147

我已经开始在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。

4

5 回答 5

257
  • 标准化之前的一切通常被称为“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 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 语言的当前版本。


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

“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 版本支持,请将 c99 替换为 c11。

于 2013-06-20T09:04:36.270 回答
9

我必须对 ANSI C 做出回应。尽管 ANSI 没有对它做任何事情,但编译器仍然是为它构建的。例如 PIC XC16 编译器:“该编译器是经过充分验证的编译器,符合 ANSI 规范 (ANSI x3.159-1989) 定义的 ANSI C 标准,并在 Kernighan 和 Ritchie 的 C 编程语言(第二版)中进行了描述。 ...”并非所有编程都适用于像 PC 这样的“大型”计算机。为您的设备成本编写编译器,并验证成本时间和美元。ANSI C 在您的嵌入式/实时设备中活得很好。

于 2016-01-27T22:29:05.297 回答
6
  • ANSI C:第一个 C 语言在 1989 年被称为 ANSI 的机构标准化,这就是它被称为 c89 的原因。

  • C99:
    随着开发者需求的需求,在1999-2000年C99中加入了更多或额外的关键字和特性(例如:内联,布尔..增加了浮点运算库函数)

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

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

于 2013-06-20T07:01:49.077 回答
4

除了伦丁答案

这是丹尼斯里奇 被问到时必须说的话

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

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

我们认为纪念第一版 10 周年会很好。更严重的是,我们去年夏天开始工作,因为当时我们有时间和意愿,而且 X3J11 似乎接近尾声。在 12 月和 1 月,当我们完成时,我们考虑了重要更改的可能性是否需要推迟交付,并且(在与出版商讨论此事后)决定不值得等待。PH 想要它,Brian 和我都希望它脱离我们的议程。

即使标准发生了变化,也很难想象它们会足够广泛以保证新版本的出现。(我们甚至准备好以某种方式处理 noalias,如果它持续的话。)我们准备在未来的印刷中进行必要的更改,但有理由希望它们应该是次要的。X3J11 的成员们也非常渴望在不让人惊讶的情况下完成。毕竟,他们中的许多人都为准备 ANSI 编译器的公司工作。

丹尼斯·里奇

于 2017-02-17T10:06:12.140 回答
-3

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

  1. C 是一种通用编程语言,最初由 Dennis Ritchie 于​​ 1969 年至 1973 年间在 AT&T 贝尔实验室开发。
  2. C99 是 ISO 发布的 C 语言标准,1999 年左右被 ANSI 采用。
  3. GNU C 只是 c89 的扩展,同时还添加了 c99 的一些特性,但总体上它与 c99 标准不同,所以在 gcc 中编译时,我们必须输入-std=c99其他答案中已经提到的。
  4. ANSI C 是 ANSI 发布的一系列标准。
于 2013-06-20T06:42:14.880 回答