C和C++标准之间的关系是什么?

Jon*_*Mee 40 c c++ standards dependencies language-lawyer

我正在写这个答案,我引自http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters

不能表示为unsigned char且不等于EOF,行为未定义

当我去检查添加了这个短语的编辑时,我发现了作者的评论:

根据C99 7.4/1,不能对任何ctype.h函数使用负符号字符

作者引用C++文档中的C99标准.这有效吗?我在C++标准中找不到关于此函数定义的任何内容,因此我必须假设它是有效的.

但这有两个原因让我担忧:

  1. 我怎么知道C++标准所依赖的C标准的版本?
  2. 各地都有C和C++之间存在差异的列表.如果我在参考C++看C标准,我怎么可能知道我正在看的区域是否被覆盖了?

Rei*_*ica 34

对于第一个问题:

C++标准明确列出了它在其规范参考部分中所依赖的C标准.对于C++ 14,[intro.refs] 1.2/1碰巧列出C 99:

  • ISO/IEC 9899:1999,编程语言 - C.
  • ISO/IEC 9899:1999/Cor.1:2001(E),编程语言 - C,技术勘误1
  • ISO/IEC 9899:1999/Cor.2:2004(E),编程语言 - C,技术勘误2
  • ISO/IEC 9899:1999/Cor.3:2007(E),编程语言 - C,技术勘误3

对于第二个问题:

C++标准没有隐含地包含C标准的任何部分; 所有对C标准的引用都是明确的.关于C++偏离C的地方的一个很好的信息来源是附件C,C++标准的"兼容性",特别是C.1 [diff.iso].

另外,对C标准库的引用分散在C++标准库的描述中(C++ 14中的第17-30章).特别感兴趣的是:

  • 17.2 [library.c],描述了C标准库的基本包含
  • 第18章[language.support],它描述<c:::>了C++标准库的许多标题(提供C标准库功能的标题库).


Bau*_*gen 14

我怎么知道C++标准所依赖的C标准的版本?

在C++ 14中,它是ISO/IEC 9899:1999(加上三个corrigendums,实质上是C99),如N4140中的1.2 [intro.refs]所述.在C++ 98中,它是C90,在C++ 17中,它可能是C11,但C++标准将始终明确.

如果我在参考C++看C标准,我怎么可能知道我正在看的区域是否被覆盖了?

您查看C++标准,它要么显式地导入C定义减去restrict它所需的任何C行为,要么进行显式修改.

通常,阅读好的文档而不是标准本身将为您提供良好的服务.


解决您的初步问题:

作者引用C++文档中的C99标准.这有效吗?

是的,因为

1和 表74 [含有std::tolower,我],75%,76%,77,78,和79描述头<cctype>,<cwctype>,<cstring>,<cwchar>,<cstdlib> (字符转换),和<cuchar>分别.
2 这些标头的内容应是相同的标准C库头<ctype.h>,<wctype.h>, <string.h>,<wchar.h>,和<stdlib.h>以及C的Unicode TR头<uchar.h>,分别具有以下修改[无那些适用于std::tolower,我]:

N4140中的21.8 [c.strings]

  • @ user3078414我的经验法则:如果我需要查看标准本身以确定我的代码是否有效,那么它太复杂或太聪明了.我大多需要我无法控制的东西的标准,例如检查cppr上的文档的正确性(罕见),或者验证*"Just for Fun"*SO和bug报告等情况中的某些行为.对于真正的代码,文档是你的朋友.cppr大多是正确的,引用它的标准来源. (7认同)
  • 对于SO问号标记的语言律师来说,当然只有标准本身是有价值的,但这只是为了有趣的事情之一. (5认同)
  • 这些都非常微妙.请问,除非自己是标准委员会的成员,否则如何区分"阅读**好**文件而不是标准本身",或者至少是一个拥有几十万行成功代码的受人尊敬的作者?谢谢,@ Baum mit Augen (2认同)