const Boo *constBoo;
Boo *nonConstBoo;
nonConstBoo = ((union {const Boo *_q; Boo *_nq;})constBoo)._nq;
Run Code Online (Sandbox Code Playgroud)
以上构造在C11中是有效的,还是只有GCC/clang扩展,您可以以这种方式将指针强制转换为匿名联合?如果它无效,是否有其他方法可以在有效的C11代码中编写等效表达式?
目的是模拟C++ const_cast,它将与C11兼容并提供一些基本类型的安全性.从const到非const指针的显式转换将使用-Wcast-qual选项触发警告,这是不合需要的.
转换为联合是 GNU C 扩展。C 标准仅定义标量类型(即整数、浮点数和指针;请参阅6.5.4p2)之间的转换。但是,您可以做的是当场复制创建联合(而不是强制转换),然后采用适当的成员:
typedef struct Boo Boo;
const Boo *constBoo;
Boo *nonConstBoo;
int main()
{
nonConstBoo = (union {const Boo *_q; Boo *_nq;}){._q=constBoo}._nq;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码应该可以工作(在 C 中,但在 C++ 中则不行,在 C++ 中,您只需要访问联合体最后使用的成员),因为限定对象和非限定对象必须具有相同的表示和对齐要求,并且这同样适用于指向限定对象的指针以及兼容类型的不合格版本(6.2.5p28)。
memcpy(&nonConstBoo,&constBoo,sizeof constBoo);
Run Code Online (Sandbox Code Playgroud)
应该可以使用任何一种语言。
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |