【问题标题】:Is memcpy(dest, src, 0) defined in the C++ standard?memcpy(dest, src, 0) 是否在 C++ 标准中定义?
【发布时间】:2020-03-10 00:06:46
【问题描述】:

This questionmany more 是该站点上众多问题之一,这些问题询问对 memcpy() 的调用是否有效,长度\大小指定为零。 回答时,大家都引用了当前的C标准(本例为C17 ISO/IEC9899:2017 page 283),

声明为size_t n 的参数指定函数数组的长度,n 可以有 调用该函数时的值为零。除非在描述中另有明确说明 在本子条款中的特定函数中,此类调用上的指针参数仍应具有有效值,如 在 7.1.4 中描述。在这样的调用中,一个定位字符的函数找不到任何出现,一个函数 比较两个字符序列返回零,一个复制字符的函数 零个字符。

但是,这是来自 C 标准,不是引用自 C++ 标准。

当前 C++ 标准(即 C++17 ISO/IEC 14882)中的哪些位置列出了相同的定义? CC++ 有两种不同的标准(和语言),据我了解,您不能引用一个标准并期望相同的规则/行为出现在另一个标准中。

如果 C 标准中的此引用在 C++ 中有效,但没有在标准中明确说明,那么有人可以提供支持 之间的这种联系的来源>CC++?

【问题讨论】:

标签: c++ standards memcpy


【解决方案1】:

C++17 标准是这么说的 the C standard library:

1 C++ 标准库还提供了 C 标准库的功能,经过适当调整以确保静态类型安全。

2 许多库函数的描述依赖于 C 标准库来获取这些函数的语义。在某些情况下,本国际标准中指定的签名可能与 C 标准库中的签名不同,并且可能在本国际标准中声明额外的重载,但行为和前提条件(包括使用ISO C restrict 限定符)是相同的,除非另有说明。

关于你的问题,

如果 C 标准中的此引用在 C++ 中有效,但没有在标准中明确说明

答案是“是”。

【讨论】:

    【解决方案2】:

    [library.c]/2,强调我的:

    许多库函数的描述依赖于 C 标准库来获取这些函数的语义。 在某些情况下,本文档中指定的签名可能与 C 标准库中的签名不同,并且可能会在本文档中声明额外的重载,但 行为和前提条件(包括任何隐含的前提条件)通过使用 ISO C 限制限定符)除非另有说明,否则相同

    [cstring.syn]/1:

    头文件<cstring>的内容和含义与C标准库头文件<string.h>相同。

    【讨论】:

      【解决方案3】:

      C 库在某种程度上融入了 C++。正如 C++17 标准的 [intro.scope] 中所说(强调我的):

      1. C++ 是一种基于 C 编程语言的通用编程语言,如中所述 ISO/IEC 9899:2011 编程语言 — C(以下简称 C 标准)。 除了 C 提供的工具,C++ 提供了额外的数据类型、类、模板、异常、命名空间、 运算符重载、函数名重载、引用、免费存储管理运算符等 图书馆设施。

      再一次,在 [intro.refs] 中:

      1. ISO/IEC 9899:2011 第 7 条中描述的库以下称为C 标准库.1

      1) 根据第 21 至 33 条和 C.5 中所述的限定条件,C 标准库是 C++ 标准的子集 图书馆。

      因此,C 标准库中的所有内容都在 C++ 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2016-10-13
        • 2011-06-21
        • 1970-01-01
        • 2019-07-24
        相关资源
        最近更新 更多