在哪里可以找到当前的 C 或 C++ 标准文档?
Posted
技术标签:
【中文标题】在哪里可以找到当前的 C 或 C++ 标准文档?【英文标题】:Where do I find the current C or C++ standard documents? 【发布时间】:2010-09-10 01:07:33 【问题描述】:许多问题的答案似乎都可以在“标准”中找到。但是,我们在哪里可以找到呢?最好是在线。
谷歌搜索有时会让人感到徒劳,尤其是对于 C 标准,因为它们被编程论坛上的大量讨论淹没了。
首先要开始,因为这些是我现在正在寻找的,哪里有好的在线资源:
C89 C99 C11 C++98 C++03 C++11 C++14 C++17【问题讨论】:
请注意MSO 上的讨论。这个问题的答案对 C 和 C++ 程序员很有价值;它应该保持开放状态(尤其是因为有一个 C++2014 标准可以添加到答案中,一旦它发布 - 它已经获得批准)。 【参考方案1】:标准的 PDF 版本
截至 2014 年 9 月 1 日 2021 年 9 月,PDF 中官方 C 和 C++ 标准文档的最佳价格位置似乎是:
C++20 – ISO/IEC 14882:2020:198 CHF (about $217 US) from iso.org
C++17 – ISO/IEC 14882:2017:$90 NZD (about $65 US) from Standards New Zealand
C++14 – ISO/IEC 14882:2014:$90 NZD (about $65 US) from Standards New Zealand
C++11 – ISO/IEC 14882:2011:$60 from ansi.org 或 $60 from Techstreet
C++03 – INCITS/ISO/IEC 14882:2003:$30 from ansi.org
C++98 – ISO/IEC 14882:1998:$80 NZD (about $60 US) from Standards New Zealand
C17/C18 – INCITS/ISO/IEC 9899:2018:$116 from INCITS/ANSI / N2176 / c17_updated_proposed_fdis.pdf draft from November 2017(链接断开,请参阅 Wayback Machine N2176)
C11 – ISO/IEC 9899:2011:$30 $60 from ansi.org / WG14 draft version N1570
C99 – INCITS/ISO/IEC 9899-1999(R2005):$60 from ansi.org / WG14 draft version N1256
C90 – ISO/IEC 9899:1990:$90 NZD (about $65 USD) from Standards New Zealand
标准的非 PDF 电子版本
C89 – ANSI 文本格式的草稿版本:(https://web.archive.org/web/20161223125339/http://flash-gordon.me.uk/ansi.c.txt) C89 – html 文档的草稿版本:(http://port70.net/~nsz/c/c89/c89-draft.html) C90 TC1; ISO/IEC 9899 TCOR1,单页 HTML 文档:(http://www.open-std.org/jtc1/sc22/wg14/www/docs/tc1.htm) C90 TC2; ISO/IEC 9899 TCOR2,单页 HTML 文档:(http://www.open-std.org/jtc1/sc22/wg14/www/docs/tc2.htm)标准的打印版本
标准的印刷版可从国家标准机构和ISO 获得,但非常昂贵。
如果您想要一份 C90 标准的硬拷贝,而且价格比上面要少得多,您可以在 Amazon 找到 Herb Schildt 的书 The Annotated ANSI Standard 的廉价二手副本,其中包含以下内容的实际文本标准(有用)和对标准的评论(不太有用 - 它包含几个危险和误导性的错误)。
Wiley 和 BSI(英国标准协会)以书本形式提供 C99 和 C++03 标准:
C++03 Standard 在亚马逊上 C99 Standard 在亚马逊上标准委员会草案版本(免费)
未来标准的工作草案通常可从委员会网站获得:
C++ committee website C committee website如果您想从当前或更早的 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" 变成了“大括号括起来的列表”。注意 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 website 上没有 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
ISO/IEC 9899:2011/Cor 1:2012(C11 唯一的技术勘误):可以在 https://www.iso.org/obp/ui/#iso:std:iso-iec:9899:ed-3:v1:cor:1:v1:en 查看,但不能下载。这是实际的更正,而不是草稿。
ISO/IEC 9899:2018 (C17/C18): https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf (N2176)
C2x 正在进行的工作 - 截至 2020 年 10 月 18 日的最新工作草案 (N2731): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n2731.pdf
对于 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 正在进行中。工作草案日期为 2021 年 3 月 17 日):http://open-std.org/JTC1/SC22/WG21/docs/papers/2021/n4885.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 链接:
https://wg21.link/std11 - C++11 https://wg21.link/std14 - C++14 https://wg21.link/std17 - C++17 https://wg21.link/std20 - C++20 https://wg21.link/std - 当前工作草案标准的当前草案在Github 上作为LaTeX 源维护。可以使用cxxdraft-htmlgen 将这些源转换为 HTML。以下站点维护这样生成的 HTML 页面:
Tim Song - Current working draft - C++11 - C++14 - C++17 - C++20 Eelis - Current working draftTim Song 还维护生成的 HTML 和 PDF 版本的 Networking TS 和 Ranges TS。
POSIX 对 C 标准的扩展
POSIX 标准 (IEEE 1003.1) 要求兼容的操作系统包含 C 编译器。该编译器必须反过来符合 C 标准,并且还必须支持在 POSIX 的“系统接口”部分定义的各种扩展(例如 off_t
数据类型、<aio.h>
标头、clock_gettime()
函数和_POSIX_C_SOURCE
宏。)
因此,如果您尝试查找特定函数,被告知“此函数是 POSIX 的一部分,而不是 C 标准”,并想知道为什么操作系统标准要求编译器功能和语言扩展......现在你知道的!
POSIX.1-2001:系统接口部分可以作为单独的文档从https://mirror.math.princeton.edu/pub/oldlinux/download/c951.pdf 下载。第 1.7 节指出 C 标准的相关版本是 C99。
“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 版本 - 但我应该补充一点,我在搜索框方面遇到了一些问题,因此使用 Google 搜索该网站可能是您最好的选择。
有一个付费链接可以在https://standards.ieee.org/standard/1003_1-2001-Cor1-2002.html 下载第一个勘误。
在https://standards.ieee.org/standard/1003_1-2001-Cor2-2004.html也有第二个付费链接
http://www.open-std.org/jtc1/sc22/open/n4217.pdf 有 POSIX.1-2008 的草稿版本。
POSIX.1-2008 也有两个技术更正,其中两个的日期为 2016 年。在https://pubs.opengroup.org/onlinepubs/9699919799.2016edition/ 有一个包含更正的标准的在线 HTML 版本 - 不过,我再次遇到以下情况:网站自己的搜索框不适合查找信息。
https://pubs.opengroup.org/onlinepubs/9699919799/ 有一个在线 HTML 版本的 POSIX.1-2017 - 不过,我再次建议使用 Google 而不是该网站的搜索框。根据Open Group website“IEEE 1003.1-2017 ... 是对 1003.1-2008 标准的修订,以汇总该标准,包括其两个技术勘误(原样)”。 Linux manpages 将其描述为与应用了技术勘误 1 和 2 的 POSIX.1-2008 “技术上相同”。因此,这不是重大修订,也不会更改 _POSIX_C_SOURCE
宏的值。
【讨论】:
Schildt 的书的问题在于,他的 cmets 严重贬低了他的 cmets 标准。 非常糟糕的书推荐(Herb Schildt's),请参阅:lysator.liu.se/c/schildt.html 我知道这篇评论——我提到这本书只是作为一种非常便宜地获得标准的可能方式。但我想人们也应该知道这篇评论。如果您想要便宜的标准硬拷贝(我就是这样做的),我建议您忽略本书的注释部分。 Schildt 的书(我认为已经绝版)比实际标准的印刷本便宜得多。有人建议,价格差异反映了注释的价值。该书的每份副本都应附有 Clive D.W. 的打印件。羽毛的The Annotated Annotated C Standard。 (请注意,Schildt 的书中缺少一些介绍性材料。) @MichaelBurr,所有标准都可以在 www.open-std.org 免费找到,因为您已经接受了答案,如何将链接更改为免费的?【参考方案2】:可以找到该标准的在线版本:
工作草案,C++ 编程语言标准
以下所有标准草案版本: 以下所有内容均可免费下载 2021-06-18:N4892 2021-03-17:N4885 2020-12-15:N4878 2020-10-18:N4868 2020-04-08:N4861
这是 C++20 标准: 此版本需要认证 2017-04-08:N4660
以下所有标准草案版本: 以下所有内容均可免费下载 (其中许多可以在main GitHub link 找到) 2020-01-14:N4849 2019-11-27:N4842 2019-10-08:N4835git 2019-08-15:N4830git 2019-06-17:N4820git 2019-03-15:N4810git 2019-01-21:N4800git 2018-11-26:N4791git 2018-10-08:N4778git 2018-07-07:N4762git 2018-05-07:N4750git 2018-04-02:N4741git 2018-02-12:N4727git 2017-11-27:N4713git 2017-10-16:N4700git 2017-07-30:N4687git
这是旧的 C++17 标准: 此版本需要认证 2017-03-21:N4660
以下所有标准草案版本: 以下所有内容均可免费下载 2017-03-21:N4659git 2017-02-06:N4640git 2016-11-28:N4618git 2016-07-12:N4606git 2016-05-30:N4594git 2016-03-19:N4582git 2015-11-09:N4567git 2015-05-22:N4527git 2015-04-10:N4431git 2014-11-19:N4296git
这是旧的 C++14 标准: 这些版本需要身份验证 2014 年 10 月 7 日:N4140git 本质上是 C++14,修正了小错误和拼写错误 2014 年 9 月 2 日:N4141git 标准 C++14 2014-03-02:N3937 2014-03-02:N3936git
以下所有标准草案版本: 以下所有内容均可免费下载 2013-10-13:N3797git 2013-05-16:N3691 2013-05-15:N3690 2012-11-02:N3485 2012-02-28:N3376 2012-01-16: N3337 git 本质上是 C++11,有小错误和错别字已更正
这是旧的 C++11 标准: 此版本需要认证 2011-04-05:N3291
以下所有标准草案版本: 以下所有内容均可免费下载 2011-02-28:N3242(与 N3291 的差异非常小) 2010-11-27:N3225 2010-08-21:N3126 2010-03-29:N3090 2010-02-16:N3035 2009-11-09:N3000 2009-09-25:N2960 2009-06-22:N2914 2009-03-23:N2857 2008-10-04:N2798 2008-08-25:N2723 2008-06-27:N2691 2008-05-19:N2606 2008-03-17:N2588 2008-02-04:N2521 2007-10-22:N2461 2007-08-06:N2369 2007-06-25:N2315 2007-05-07:N2284 2006-11-03:N2134 2006-04-21:N2009 2005-10-19:N1905 2005-04-27:N1804
这是旧的 C++03 标准: 以下所有版本都需要身份验证 2004-11-05:N1733 2004-07-16: N1655 非官方 2004-02-07:N1577 C++03(或非常接近) 2001-09-13:N1316 扩展技术勘误草案 1997-00-00:N1117 扩展技术勘误草案
以下所有标准草案版本: 以下所有内容均可免费下载 1996-00-00:N0836 扩展技术勘误草案 1995-00-00:N0785 信息系统国际标准草案提案工作论文 - 编程语言 C++
其他有趣的论文:
2021/ 2020 / 2019 / 2018 / 2017/ 2016 / 2015 / 2014 / 2013/ 2012/ 2011
【讨论】:
您可能想提及链接将您带到什么标准!同时添加 C11 标准:open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf +1 用于保持比ISO working group 21 持续更新的列表。 列表+1;只是要补充一点,所有草稿都可以作为 git 存储库github.com/cplusplus/draft 使用。您可以将链接添加到isocpp.org/std/the-standard @k-five:Sombody 好像在 github 上发布了一个版本:github.com/cplusplus/draft/blob/master/papers/n4140.pdf @LokiAstari 链接到工作草案的 HTML 版本是否有益,例如 timsong-cpp.github.io/cppwp(不确定哪个草案,似乎是最近的)或 n3337?【参考方案3】:C99 是available online。引用自www.open-std.org:
该标准的最新公开版本是 组合 C99 + TC1 + TC2 + TC3,WG14 N1256,日期为 2007-09-07。这是 WG14 工作文件,但它反映了 发布时间。
【讨论】:
【参考方案4】:草稿链接:
C++11(+编辑修复):N3337 HTML, PDF
C++14(+编辑修复):N4140 HTML, PDF
C11 N1570 (text)
C99N1256
标准的Drafts 在批准和发布之前分发以征求意见。
Note 工作草案不是当前有效的标准,也不完全是已发布的标准
【讨论】:
“N1169”链接指向一个包含一些缺陷报告的四页文档。它在任何意义上都不是 C++(或任何其他)标准的草案。 我喜欢这个答案,因为它清楚地说明了每个主要版本的最新草案是什么。【参考方案5】:您可能会发现用于 C++0x 的 draft international standard 很有用。
【讨论】:
FCD 是 available now。【参考方案6】:ISO 标准需要花钱,从中等(PDF 版本)到更多(书籍版本)。
虽然它们尚未最终确定,但通常可以在网上找到它们的草稿。大多数情况下,最终版本与最终草稿没有太大区别,因此虽然不完美,但它们会很合适。
C++ 0x draft【讨论】:
【参考方案7】:Wiley 提供了 C99 和 C++03 标准的书籍形式:
C++ Standard on Amazon C Standard on Amazon此外,如前所述,未来标准的工作草案通常可从委员会网站获得:
C++ committee website C committee websiteC-201x 草案以N1336 提供,C++0x 草案以N3225 提供。
【讨论】:
请注意 Wiley 的 C 标准印刷版:它是 C99 标准,而不是 C89/90。【参考方案8】:draft of the ANSI C standard(又名 C.89)的文本可在线获取。这在被 ISO C 标准 (C.90) 接受之前由 ANSI 委员会标准化,因此各部分的编号不同(ANSI 部分 2 到 4 大致对应于 ISO 部分 5 到 7),尽管内容是(假设to be) 大体相同。
【讨论】:
真的是最后一稿吗?我知道的一个区别是,该草案将 tm_sec 的范围指定为[0, 60]
,而 C90(错误地)[0, 61]
@Cubbi,因为我不能亲自证明是这样,所以我修改了措辞。谢谢。
@Cubbi:他确实说过这是 ANSI 标准的最后一个草案。听起来 ISO WG 中的某个人感到困惑,并认为一年中可能的两个闰秒也可能发生在同一 分钟 之内/之后……或者他们从 POSIX 那里得到了错误,他们不知道没有说他们从哪里得到它,只是他们修复它以与 C99 保持一致。
K&R 第二版。 (ANSI C),它不是基于实际的最终标准,它确实指定tm_sec
是(0, 61)
。我认为那是闰秒,有道理。
@veganaiZe 范围为 [0, 60] 以允许闰秒(否则为 [0, 59])。 [0, 61] 是一个错误,暗示在同一分钟内可能有两个闰秒(事实并非如此)。【参考方案9】:
ISO C 和 C++ 标准非常昂贵。另一方面,INCITS 以更少的价格重新发布它们。 http://www.techstreet.com/ 似乎有 30 美元的 PDF (搜索 INCITS/ISO/IEC 14882:2003)。
也提供硬拷贝版本。查找由 Wiley 发布的英国标准协会版本。
【讨论】:
目前,techstreet.com 有 PDF 格式的 C++2003 标准,价格为 30 美元,C++2011 标准为 403 美元。 非常感谢 Techstreet 的链接。 ANSI.org 的网上商店不会向我出售 C11 标准(出于“安全”原因拒绝信用卡,即没有充分的理由),而在 Techstreet 的等价购买(使用同一张卡)进行顺利且没有搭便车。【参考方案10】:实际的标准文件可能不是最有用的。大多数编译器没有完全实现这些标准,有时实际上可能会发生冲突。因此,您已经拥有的编译器文档将更加有用。此外,该文档将包含特定于平台的备注和任何警告说明。
【讨论】:
编译器文档很重要,但了解语言而不是了解您的实现要重要得多。 使用实际标准,您可以在编译器中找到错误,并通过修补它们、提交错误报告或简单地进入 IRC 房间并与可以修复它的人交谈来帮助他们更好地遵循标准。 @hdante -- 绝对。当您将标准本身视为理想时,您可以要求供应商提供兼容性。 @/all -- 这里的意图并不是说标准没有用(仅供参考,从标准开始是我过去采用的方法),但你也必须知道你的真实世界起点,希望符合标准。 无论如何,编译器文档往往会遗漏标准中涵盖的内容。【参考方案11】:虽然不是一个实际的标准,但对 ISO C (C89/90) 有一个称为 C94/95 或规范附录 1 的修订。它被集成到 C99 中,尽管某些编译器(例如 Clang)允许您指定 @ 987654327@ 在命令行上。 ISO/IEC 9899:1990/Amd 1:1995 可以从SAI GLOBAL(PDF 或硬拷贝)以高昂的价格购买。
http://clc-wiki.net/wiki/The_C_Standard文档摘要可以在here找到。
http://www.lysator.liu.se/c/na1.html当(当时的草案)ANSI C 标准被考虑用于 1990 年通过了一个国际标准,有几个 反对,因为它没有解决国际化问题。 由于该标准已经制定了几年,它 同意将进行一些更改以提供基础(对于 例如,添加了 7.10.7 中的功能),并且工作将 分开进行以提供适当的国际化 标准。这项工作在规范性附录 1 中达到了高潮。
规范性附录 1 体现了 C 对限制和 国际字符集的承诺。有向图和 标头旨在改善用 C 语言编写的 C 程序的外观 不带 或 字符的 ISO 646 的国家变体。在 频谱的另一端,连接到和 将旧标准的勉强基础扩展到 用于处理宽字符的完整且一致的实用程序集 和多字节字符串。
本文档总结了规范性附录 1。它旨在 快速通知已经熟悉标准的读者;它 没有也不能介绍 NA1 背后的复杂主题, 也不能代替原文件作为参考手册。 (尽管如此,它试图尽可能准确,其作者 想知道任何错误或遗漏。)
【讨论】:
SAI Global 链接不再有效。我检查了archive.org,它确实有一次重定向-基于我认为infostore.saiglobal.com/en-gb/standards/…是购买NA1的新URL。以上是关于在哪里可以找到当前的 C 或 C++ 标准文档?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里可以找到为验证 python 标准库中的函数而进行的测试?