C 和 C++ 标准之间的关系是啥?
Posted
技术标签:
【中文标题】C 和 C++ 标准之间的关系是啥?【英文标题】:What is the Relationship Between the C and C++ Standards?C 和 C++ 标准之间的关系是什么? 【发布时间】:2016-10-03 12:57:29 【问题描述】:我写的是this answer,引用自http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters
不能表示为 unsigned char 且不等于 EOF,行为未定义
当我去查看the edit that had added this phrase时发现作者的评论:
根据 C99 7.4/1,任何 ctype.h 函数都不能使用负符号字符
作者引用了 C++ 文档中的 C99 标准。那有效吗?我在 C++ 标准中找不到关于这个函数的定义的任何内容,所以我必须假设它是有效的。
但这有两个原因让我担心:
-
我如何知道 C++ 标准所依赖的 C 标准版本?
有the discrepancies between C and C++ everywhere 的列表。如果我参考 C++ 查看 C 标准,我怎么可能知道我正在查看的区域是否已被覆盖?
【问题讨论】:
FWIW,第一个描述“不能表示为 unsigned char ...”是对 C99 和 C11 要求的非常接近的解释。作者的评论“不能使用负无符号字符......”是错误的(更不用说自相矛盾了)。很抱歉让事情变得混乱;我第一次没有仔细阅读你的问题。 哎呀,错误地引用了第二条评论:它是“负符号字符”,而不是“负无符号字符”。然而,“负符号字符”是完全错误的,因为不能表示为有符号字符的负值也是被禁止的,因为EOF
很可能可以表示为负符号字符。
相关的,如果不是重复的话:***.com/a/34308279/2003898
@PeteBecker 这是我的提交评论,我指的是 \xb4 我用它更改为未签名(同时还添加了对 UB 的提及)。但是,是的,它不够迂腐。
【参考方案1】:
第一个问题:
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:::>
标头。
【讨论】:
【参考方案2】:我如何知道 C++ 标准依赖于哪个版本的 C 标准?
在 C++ 14 中,它是 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
,我]、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]
【讨论】:
这些都是非常微妙的事情。拜托,除非自己是标准委员会的成员,或者至少是一位拥有几千万行成功代码的受人尊敬的作者,否则如何区分“阅读好文档而不是标准本身”?谢谢,@Baum mit Augen @user3078414 我的经验法则:如果我需要查看标准本身来确定我的代码是否有效,这太复杂或太聪明了。对于我无法控制的东西,我主要需要标准,例如检查 cppr 文档的正确性(罕见),或验证 “只是为了好玩” 情况下的某些行为,例如 SO 和错误报告。对于真正的代码,文档是你的朋友。 cppr 大部分是正确的,并在标准中引用了它的来源。 对于 SO question tagged language-lawyer,当然只有标准本身很重要,但这只是为了好玩。【参考方案3】:编辑是正确的,并且这个特定的文本自 C90 以来一直在标准中。
从 C90 4.3 开始
标头声明了几个对测试有用的函数 和映射字符。在所有情况下,参数都是 int , 其值应可表示为无符号字符或应 等于宏 EOF 的值。如果论点有任何其他 值,行为未定义。
从 C11 7.4/1
标头声明了几个对分类有用的函数 和映射字符。在所有情况下,参数都是一个 int, 其值应可表示为无符号字符或应 等于宏 EOF 的值。如果参数有任何其他值, 行为未定义。
相同的文本; C一直都是这样。因此,您的特定 C++ 版本使用哪个 C 版本并不重要,因为所有 C 版本都是等效的。
【讨论】:
Nit pick:4.3 是 C89(ISO 前)编号。 C90 做到了 7.3。 @Cubbi 这是来自“X3”C89 标准之一,我无权访问 ISO C90。以上是关于C 和 C++ 标准之间的关系是啥?的主要内容,如果未能解决你的问题,请参考以下文章
RTD与PT100的关系 RTD与PT100之间的联系和区别是啥呢?