我有一段看起来像这样的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删除该警告,但当然这将消除您实际关注的案例的警告.
该警告来自C标准中可能的 bug,或(取决于您的解释)GCC应特别处理的案例.我相信const限定符可以安全无误地提升到数组类型.您可以使用-Wno-cast-qual删除该警告,但当然这将消除您实际关注的案例的警告.
详细说明,类型const char(*)[2]表示“指向const char的数组(长度为2)”.该数组未标记为const,只是数组的元素.与const void *类型相比,编译器注意到后者是指向const的指针,而前者则不是,因此生成警告. C标准没有办法将数组标记为const,即使const数组等同于const数组.