C和C++标准库之间的关系

5
这个问题与编程或特定语言概念并没有直接关系。我的问题是,我们能否使用对C国际标准的引用(例如C11)来提供一个规范性的参考,以描述C++中任何概念的C库。更具体地说,在头文件中,定义了N3797 :: 18.3.3 [c.limits]中所述的C库头文件。但是,C标准提供了关于内容的更全面信息,而不是N3797工作草案。
因此,C11中定义的C库的所有内容都适用于C++11中定义的C库的实现,还是我们不能依赖于C标准提供的内容?

@ShafikYaghmour 从回答中我所理解的是,我们只能使用 C 标准的引用部分作为规范参考。对吗? - user2953119
据我所了解,C++标准必须明确引用规范参考,否则我们不能引用规范参考的部分。 - Shafik Yaghmour
我把我的上面的评论移到了我的答案中,所以现在我们可以删除这些评论了。 - Shafik Yaghmour
1个回答

9
对于C++标准库,C++会使用C标准库。在C++11之前,C++所使用的C标准是C90,而在C++11中所使用的C标准为C99而非C11。此规定详见第1.2节的规范参考文献部分。

以下所列文献对于本文件的应用不可或缺。对于已日期标注的参考文献,仅引用所标注版本。对于未日期标注的参考文献,则应引用该文献的最新版本(包括任何修订内容)。

具体内容如下:

  • 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

并且还说:

在 ISO/IEC 9899:1999 的第 7 条和 ISO/IEC 9899:1999/Cor.1:2001 的第 7 条以及 ISO/IEC 9899:1999/Cor.2:2003 的第 7 条中描述的库,以下简称 C 标准库。1

C++ 标准使用术语“C 标准库”来指代 C99 和 TCs,并明确说明 C++ 与 C 不同的地方。

第17.2节 The C standard library 中提到:

  1. C++标准库也提供了C标准库的功能,经过适当调整以确保静态类型安全。
  2. 许多库函数的描述依赖于C标准库来获取这些函数的签名和语义。在所有这些情况下,都应省略使用restrict限定符。

cname头文件对应于C标准库name.h文件,在第17.6.1.2节Headers中进行了覆盖,其中包括:

除了第18到30条和附录D中提到的内容外,每个头文件的cname内容应与相应的头文件name.h的内容相同,如C标准库(1.2)或C Unicode TR所指定的那样,就像被包含一样。然而,在C++标准库中,声明(除了在C中定义为宏的名称)位于命名空间std的命名空间范围内(3.3.6)。这些名称是否首先在全局命名空间范围内声明,然后通过显式using-declaration(7.3.3)注入到命名空间std中是未指定的。
与limits.h相关的climits的内容在第18.3.3节中涵盖,并且说道:“其内容与标准C库头文件相同。[注意:不要求宏定义的常量类型与宏引用的类型匹配。—注]”
请注意,正如我在上面的评论中提到的那样,规范参考并不是作为一个整体被采用的,C++标准必须明确引用规范参考才能适用于C++标准。有关更多详细信息,请参见我们可以将未明确引用自规范参考的内容应用于C++标准吗?

@ShafikYaghmour 特别是在 <climits> 头文件的情况下,我们可以依赖于 C 标准对其的规定,不是吗? - user2953119
@DmitryFucintv 我认为[c.limits]/2想要告诉我们的是:“其内容与标准C库头文件<limits.h>相同”--据我理解,“内容”也包括常量等规范。 - dyp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接