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

前端之家收集整理的这篇文章主要介绍了在C中正确地将const void指针强制转换为const char指针数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一段看起来像这样的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数组.

猜你在找的C&C++相关文章