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++标准中找不到关于此函数定义的任何内容,因此我必须假设它是有效的.
但这有两个原因让我担忧:
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章).特别感兴趣的是:
<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]