C标准和C++标准之间的关系是什么?

What is the Relationship Between the C and C++ Standards?

本文关键字:标准 关系 是什么 之间 C++      更新时间:2023-10-16

我正在写这个答案,我引用了 http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters

不能表示为无符号字符且不等于 EOF,行为未定义

当我去检查添加这句话的编辑时,我发现作者的评论:

不能将负签名字符与任何 ctype.h 函数一起使用,符合 C99 7.4/1

作者在C++文档中引用了C99标准。这有效吗?我在C++标准中找不到有关此函数定义的任何内容,因此我必须假设它是有效的。

但这让我担心有两个原因:

  1. 我怎么知道C++标准依赖于哪个版本的 C 标准?
  2. 到处都有 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 版本都是等效的。