在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数组. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |