指向匿名联合的指针是否在C11中有效?

Fil*_*ara 7 c c11

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选项触发警告,这是不合需要的.

PSk*_*cik 4

转换为联合是 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)

应该可以使用任何一种语言。