我在哪里可以找到当前的 C 或 C 标准文档?

新手上路,请多包涵

对于许多问题,答案似乎可以在“标准”中找到。但是,我们在哪里可以找到呢?最好是在线的。

谷歌搜索有时会让人感到徒劳,尤其是对于 C 标准,因为它们被编程论坛上的大量讨论淹没了。

为了开始这个,因为这些是我现在正在搜索的,哪里有好的在线资源:

  • C89
  • C99
  • C11
  • C++98
  • C++03
  • C++11
  • C++14
  • C++17

原文由 Christoffer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

标准的 PDF 版本

截至 2014 年9 月 1 日2022 年 3 月,PDF 中官方 C 和 C++ 标准文档的最佳价格位置似乎是:

标准的非 PDF 电子版本

警告:标准草案的大多数副本以 PDF 格式发布,如果文本/HTML 是从 PDF 转录或自动生成的,则可能会引入错误。

(托管 C++11 工作草案纯文本版本的站点也有一些这种格式的 C++14 草案。但它们都不是最终工作草案 N4140 的副本。)

标准的印刷版本

标准的印刷副本可从国家标准机构和 ISO 获得,但非常昂贵。

如果您想要一份 C90 标准的硬拷贝,而且价格比上面要少得多,您可以在 Amazon 上找到 Herb Schildt 的书 The Annotated ANSI Standard 的廉价二手副本,其中包含标准的实际文本(有用)和对该标准的评论(不太有用 - 它包含几个危险和误导性的错误)。

C99 和 C++03 标准可从 Wiley 和 BSI(英国标准协会)以书本形式获得:

标准委员会草案版本(免费)

未来标准的工作草案通常可从委员会网站获得:

如果您想从当前或更早的 C/C++ 标准中获取草稿,可以在 Internet 上免费获得一些:

对于 C:

  • ANSI X3.159-198 (C89):我找不到 C89 的 PDF,但它与 C90 几乎相同。唯一的主要区别在于样板和章节编号,尽管有一些细微的文本差异

  • ISO/IEC 9899:1990 (C90):(与 ANSI X3.159-198 (C89) 几乎相同,只是前文和章节编号除外。第 6.5.7 节(之前的 3.5.7)至少有一处文字差异,其中 “a list” 变成 了“a括号括起来的list” 。请注意,ANSI和ISO/IEC标准之间的转换见于本文档中,文档将其名称称为“ANSI/ISO: 9899/99”,尽管这不是后来制定的标准的正确名称,正确名称是“ISO/IEC 9899:1990”)

  • C90 的 TC1: http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n423.pdf

  • 遗憾的是, WG14 网站 上没有 TC2 的 PDF 链接。

  • ISO/IEC 9899:1999(包含所有三个技术勘误的 C99): http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

  • 仅包含 TC1 和 TC2 的 C99 早期版本: http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

  • 原始(即勘误前)C99 的工作草案: http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n843.htm (HTML) 和 http://www.dkuug。 dk/JTC1/SC22/WG14/www/docs/n843.pdf (PDF)。请注意,后来有两个工作草案:N869 和 N878,但它们似乎已从 WG14 网站上删除,因此这是可用的最新版本。

  • C89/C90 和 C99 之间的变化列表:http: //port70.net/~nsz/c/c89/c9x_changes.html

  • C99 的 TC1(只有 TC,不是包含它的标准): http ://www.open-std.org/jtc1/sc22/wg14/www/docs/9899tc1/n32071.PDF

  • C99 的 TC2(只有 TC,不是包含它的标准): http ://www.open-std.org/jtc1/sc22/wg14/www/docs/9899-1999_cor_2-2004.pdf

  • ISO/IEC 9899:2011 (C11): http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

有关 N1570 与 C11 最终发布版本之间差异的信息,请参阅 C11 中的 最新更改https://groups.google.com/g/comp.std.c/c/v5hsWOu5vSw

对于 C++:

  • ISO/IEC 14882:1998 (C++98): http ://www.lirmm.fr/~ducour/Doc-objets/ISO+IEC+14882-1998.pdf

  • ISO/IEC 14882:2003 (C++03): https ://cs.nyu.edu/courses/fall11/CSCI-GA.2110-003/documents/c++2003std.pdf

  • ISO/IEC 14882:2011 (C++11): http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

  • ISO/IEC 14882:2014 (C++14): https ://github.com/cplusplus/draft/blob/master/papers/n4140.pdf?raw=true

  • ISO/IEC 14882:2017 (C++17): http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf

  • ISO/IEC 14882:2020 (C++20): https ://isocpp.org/files/papers/N4860.pdf

  • ISO/IEC 14882:2023(C++23 正在进行中。工作草案日期为 2022 年 3 月 17 日): https ://open-std.org/JTC1/SC22/WG21/docs/papers/2022/n4910.pdf

请注意,这些文件与标准不同,尽管在决定标准的会议之前的版本通常非常接近最终标准中的版本。 FCD(最终委员会草案)版本受密码保护;您需要加入标准委员会才能获得它们。

尽管草案版本可能非常接近标准的最终批准版本,但本文的一些编辑强烈建议您获取实际文件的副本——尤其是如果您打算引用它们作为参考。当然,如果现金拮据,饥饿的学生应该继续使用汇票。


看来,如果您愿意并且能够在标准批准后等待几个月,那么在寻找标准时搜索“INCITS/ISO/IEC”而不是“ISO/IEC”是关键。通过这样做,本文的一位编辑能够以合理的价格找到 C11 和 C++11 标准。例如,如果您在 webstore.ansi.org 上搜索“INCITS/ISO/IEC 9899:2011”而不是“ISO/IEC 9899:2011”,您会找到价格合理的 PDF 版本。


站点 https://wg21.link/ 提供 C++ 当前工作草案和标准草案以及委员会文件的短 URL 链接:


该标准的当前草案在 Github 上作为 LaTeX 源维护。可以使用 cxxdraft-htmlgen 将这些源转换为 HTML。以下站点维护这样生成的 HTML 页面:

Tim Song 还维护生成的 HTML 和 PDF 版本的 Networking TS 和 Ranges TS。

C 标准的 POSIX 扩展

POSIX 标准 (IEEE 1003.1) 要求兼容的操作系统包含 C 编译器。该编译器必须符合 C 标准,并且还必须支持 POSIX 的“系统接口”部分中定义的各种扩展(例如 off_t 数据类型、 <aio.h> 标头, clock_gettime() 函数和 _POSIX_C_SOURCE 宏。)

因此,如果您尝试查找特定函数,被告知“此函数是 POSIX 的一部分,而不是 C 标准的一部分”,并想知道为什么操作系统标准要求编译器功能和语言扩展……现在你知道了!

“Shell 和实用程序”部分 ( https://mirror.math.princeton.edu/pub/oldlinux/download/c952.pdf ) 要求不仅应该存在符合 C99 的编译器,而且应该可以从名为“c99”的命令行。实现这一点的一种方法是在 /usr/bin 中放置一个名为“c99”的 shell 脚本,该脚本调用 gcc,并在命令行参数列表中添加了 -std=c99 选项,并阻止任何从被指定的竞争标准。

POSIX.1-2001 有两份技术勘误,一份日期为 2002 年,另一份日期为 2004 年。我认为它们没有包含在上面链接的文件中。在 https://pubs.opengroup.org/onlinepubs/009695399/ 有一个包含更正的在线 HTML 版本 - 但我应该补充一点,我的搜索框遇到了一些问题,因此使用谷歌搜索该网站可能是你的最好的选择。

有一个付费链接可以在 https://standards.ieee.org/standard/1003_1-2001-Cor1-2002.html 下载第一个勘误。

https://standards.ieee.org/standard/1003_1-2001-Cor2-2004.html 上还有第二个付费链接

POSIX.1-2008 也有两个技术更正,后者的日期是 2016 年。在 https://pubs.opengroup.org/onlinepubs/9699919799.2016edition/ 上有一个包含更正的标准的在线 HTML 版本 - 虽然,我也遇到过网站自己的搜索框不适合查找信息的情况。

  • https://pubs.opengroup.org/onlinepubs/9699919799/ 上有一个 POSIX.1-2017 的在线 HTML 版本 - 不过,我再次建议使用 Google 而不是该站点的搜索框。根据 Open Group 网站,“IEEE 1003.1-2017 … 是对 1003.1-2008 标准的修订,以汇总该标准,包括其两个技术勘误(原样)”。 Linux 联机帮助页 将其描述为与应用了 Technical Corrigenda 1 和 2 的 POSIX.1-2008 “技术上相同”。因此,这不是重大修订,也不会更改 _POSIX_C_SOURCE 宏的值。

原文由 Michael Burr 发布,翻译遵循 CC BY-SA 4.0 许可协议

ANSI C 标准(又名 C.89)的草案 文本可在线获取。这在被 ISO C 标准 (C.90) 接受之前由 ANSI 委员会标准化,因此各部分的编号不同(ANSI 部分 2 到 4 大致对应于 ISO 部分 5 到 7),尽管内容是(假设to be) 大体相同。

原文由 jxh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题