加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中正确地将const void指针强制转换为const char指针数组

发布时间:2020-12-16 05:51:15 所属栏目:百科 来源:网络整理
导读:我有一段看起来像这样的C代码: const char (*foo)[2] = bar(); 现在bar()是一个返回(const void *)的函数.如何正确转换此const指针?该代码从GCC产生此警告: "initialization discards qualifiers from pointer target type". 以下是我不成功的一些尝试:
我有一段看起来像这样的C代码:
const char (*foo)[2] = bar();

现在bar()是一个返回(const void *)的函数.如何正确转换此const指针?该代码从GCC产生此警告:

"initialization discards qualifiers from pointer target type".

以下是我不成功的一些尝试:

const char (*foo)[2] = (const char *)bar();
const char (*foo)[2] = (const void **)bar();

原始代码确实有效,我只是无法通过正确转换返回值来消除警告.

编辑:有人建议:

const char (*foo)[2] = (const char (*)[2])bar();

它似乎是正确的,但GCC给出了这个警告:

"cast discards qualifiers from pointer target type"

这几乎与原始警告相同.

编辑2:好的,我想我已经知道了.这里真正的问题是bar()的(const void *)定义.定义中的const(const char(*)[2])指的是数组的元素,而不是指向数组的指针.这种类型定义本质上是一个数组,当由void指针表示时,它不是const.真正的答案是(const void *)在转换为(const char(*)[2])时会失去其常量.

解决方法

其他几个人已经说过正确的演员,但它产生了 spurious warning.
该警告来自C标准中可能的 bug,或(取决于您的解释)GCC应特别处理的案例.我相信const限定符可以安全无误地提升到数组类型.您可以使用-Wno-cast-qual删除该警告,但当然这将消除您实际关注的案例的警告.

详细说明,类型const char(*)[2]表示“指向const char的数组(长度为2)”.该数组未标记为const,只是数组的元素.与const void *类型相比,编译器注意到后者是指向const的指针,而前者则不是,因此生成警告. C标准没有办法将数组标记为const,即使const数组等同于const数组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读