标准化之前的一切通常被称为“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。