C和C ++标准之间的关系是什么?
我正在写这个答案 ,我引用http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters
不能表示为无符号字符,并不等于EOF,行为是未定义的
当我去检查添加了这个短语的编辑时,我发现作者的评论:
不能使用每个C99 7.4 / 1的任何ctype.h函数的带负号的字符
作者引用C ++文档中的C99标准。 这有效吗? 在C ++标准中,我找不到这个函数的定义,所以我必须假定它是有效的。
但是这个问题有两个原因:
- 我怎么知道C ++标准依赖于什么版本的C标准?
- 有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版本都是相同的。