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++ 标准之间的关系是啥?的主要内容,如果未能解决你的问题,请参考以下文章

c++的类和结构体是啥关系

RTD与PT100的关系 RTD与PT100之间的联系和区别是啥呢?

探究一下c++标准IO的底层实现

linux下的PID,PIDD是啥?他们之间的关系以及应用是啥?

C++标准库与STL的关系

C语言中,逻辑类型是啥?集合类型又是啥?