我有一段 C 代码,如下所示:
const char (*foo)[2] = bar();
Now bar()
是一个返回 a 的函数(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:好的,我想我已经明白了。真正的问题是( const void * )
的定义bar()
. The const
在定义中(const char( * )[2])
指的是数组的元素,而不是指向数组的指针。该类型定义本质上是一个数组,当用 a 表示时void
指针是not const
。真正的答案是( const void * )
失去它的cons
施放时的配合度(const char ( * )[2])
.
其他几个人已经指出了正确的演员阵容,但它产生了虚假警告 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31887。
该警告可能来自于bug https://stackoverflow.com/questions/305293/constant-array-types-in-c-flaw-in-standard在 C 标准中,或者(取决于你的解释)GCC 应该特殊对待的情况。我相信const
限定符可以安全且明确地提升为数组类型。您可以删除该警告-Wno-cast-qual
但当然,这将消除您真正关心的情况的警告。
详细来说,类型const char (*)[2]
意思是“指向数组(长度为2)的指针const
char
".数组未标记const
,只是数组的元素。与类型相比const void *
,编译器注意到后者是一个指向const
,而前者则不然,因此会生成警告。 C 标准没有提供将数组标记为const
,即使一个const
数组将相当于一个数组const
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)