C标准和C++标准之间的关系是什么?
What is the Relationship Between the C and C++ Standards?
我正在写这个答案,我引用了 http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters
不能表示为无符号字符且不等于 EOF,行为未定义
当我去检查添加这句话的编辑时,我发现作者的评论:
不能将负签名字符与任何 ctype.h 函数一起使用,符合 C99 7.4/1
作者在C++文档中引用了C99标准。这有效吗?我在C++标准中找不到有关此函数定义的任何内容,因此我必须假设它是有效的。
但这让我担心有两个原因:
- 我怎么知道C++标准依赖于哪个版本的 C 标准?
- 到处都有 C 和 C++ 之间的差异列表。如果我参考C++查看 C 标准,我怎么可能知道我正在查看的区域是否已被覆盖?
对于第一个问题:
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:::>
头文件。
我怎么知道C++标准依赖于哪个版本的 C 标准?
在第 14 C++中,它是 ISO/IEC 9899:1999(加上三个更正,所以本质上是 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
,me],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
,ME]:
N4140 中的 21.8 [c.strings]
编辑是正确的,并且此特定文本自 C90 以来一直在标准中。
从 C90 4.3
标头声明了几个对测试有用的函数 和映射字符。在所有情况下,参数都是 int , 其值应表示为无符号字符或 等于宏 EOF 的值。 如果参数有任何其他 值,则行为未定义。
从 C11 7.4/1
标头声明了几个对分类有用的函数 和映射字符。在所有情况下,参数都是 int, 其值应表示为无符号字符或 等于宏 EOF 的值。如果参数具有任何其他值, 行为未定义。
相同的文本;C一直都是这样。因此,您的特定 C++ 版本使用哪个 C 版本并不重要,因为所有 C 版本都是等效的。
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- C++GTKMM gui循环依赖关系
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- C++ 标准库是否比 winAPI 具有更多的环境依赖关系?
- 酿造警告:依赖关系是使用不同的C 标准库构建的
- C标准和C++标准之间的关系是什么?
- 定义浮点等价关系的标准方法
- 什么是 ABI,为什么C++没有标准,如果有的话又有什么关系?
- C 和C++标准库之间的关系
- 有符号整数类型的最小值和最大值之间关系的C++标准保证是什么
- 标准::unique_lock<mutex>和conditional_variable的关系
- 是否有任何标准的包含顺序来避免隐藏的依赖关系