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

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

不能表示为无符号字符,并不等于EOF,行为是未定义的

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

不能使用每个C99 7.4 / 1的任何ctype.h函数的带负号的字符

作者引用C ++文档中的C99标准。 这有效吗? 在C ++标准中,我找不到这个函数的定义,所以我必须假定它是有效的。

但是这个问题有两个原因:

  1. 我怎么知道C ++标准依赖于什么版本的C标准?
  2. 有C和C ++之间的差异列表。 如果我参照C ++来看C标准,我怎么可能知道我所看到的区域是否被覆盖了?

对于第一个问题:

C ++标准明确列出了它在规范引用部分所依赖的C标准。 对于C ++ 14,[intro.refs] 1.2 / 1碰巧列出了C99:

  • 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章介绍了C ++标准库(提供C标准库function的那些)的许多<c:::>头文件。

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

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

如果我参照C ++来看C标准,我怎么可能知道我所看到的区域是否被覆盖?

你看看C ++标准,它显式地导入了C的定义,减去了restrict或者C想要的行为,或者做了明确的修改。

通常,阅读良好的文档,而不是标准本身将为您服务就好了。


解决你最初的问题:

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

是的,因为

1表74 [包含std::tolower ,me], <cwctype>和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]

编辑是正确的,这个特定的文本自C90以来一直处于标准。

从C90 4.3

头文件声明了几个用于testing和映射字符的函数。 在任何情况下,参数都是一个int值,它的值可以表示为一个无符号的char或者等于macrosEOF的值。 如果参数具有任何其他值,则行为是未定义的。

从C11 7.4 / 1

头文件声明了几个用于分类和映射字符的函数。 在任何情况下,参数都是一个int值,它的值可以表示为一个无符号的char或者等于macrosEOF的值。 如果参数具有任何其他值,则行为是未定义的。

相同的文字; C一直是这样的。 因此,C ++版本使用哪个版本并不重要,因为所有C版本都是相同的。