const Boo *constBoo;
Boo *nonConstBoo;
nonConstBoo = ((union {const Boo *_q; Boo *_nq;})constBoo)._nq;
上述构造在 C11 中有效,还是只有 GCC/clang 扩展才能以这种方式将指针强制转换为匿名联合?如果它无效,是否有其他方法可以在有效的 C11 代码中编写等效表达式?
目的是模拟与 C11 兼容的 C++ const_cast 并提供一些基本的类型安全性。从 const 到非 const 指针的显式转换将触发带有 -Wcast-qual 选项的警告,这是不希望的。
投向工会 https://gcc.gnu.org/onlinedocs/gcc/Cast-to-Union.html是 GNU C 的扩展。 C 标准仅定义标量类型(即整数、浮点数和指针;请参阅6.5.4p2 http://port70.net/~nsz/c/c11/n1570.html#6.5.4p2)。然而,您可以做的是当场复制创建联合(而不是强制转换),然后采用适当的成员:
typedef struct Boo Boo;
const Boo *constBoo;
Boo *nonConstBoo;
int main()
{
nonConstBoo = (union {const Boo *_q; Boo *_nq;}){._q=constBoo}._nq;
}
上面的代码应该可以工作(在 C 中,但在 C++ 中则不行,因为 C++ 中只需要访问联合体最后使用的成员),因为限定对象和非限定对象必须具有相同的表示和对齐要求,并且这同样适用于指向限定对象的指针以及兼容类型的非限定版本(6.2.5p28 http://port70.net/~nsz/c/c11/n1570.html#6.2.5p28).
memcpy(&nonConstBoo,&constBoo,sizeof constBoo);
应该可以使用任何一种语言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)