gpt4 book ai didi

c - 指向匿名 union 的指针转换在 C11 中有效吗?

转载 作者:太空狗 更新时间:2023-10-29 17:09:47 26 4
gpt4 key购买 nike

const Boo *constBoo;
Boo *nonConstBoo;

nonConstBoo = ((union {const Boo *_q; Boo *_nq;})constBoo)._nq;

上述构造在 C11 中是否有效,或者它是否只是 GCC/clang 扩展,您可以以这种方式将指针转换为匿名 union ?如果它无效,是否有任何其他方法可以用有效的 C11 代码编写等效表达式?

目的是模拟与 C11 兼容并提供一些基本类型安全性的 C++ const_cast。从 const 到非常量指针的显式转换将触发带有 -Wcast-qual 选项的警告,这是不可取的。

最佳答案

Cast to a union是 GNU C 扩展。 C 标准仅定义标量类型(即整数、 float 和指针;参见 6.5.4p2)之间的转换。但是,您可以做的是当场复制创建 union (而不是转换为 union ),然后采用适当的成员:

typedef struct Boo Boo;
const Boo *constBoo;
Boo *nonConstBoo;

int main()
{
nonConstBoo = (union {const Boo *_q; Boo *_nq;}){._q=constBoo}._nq;
}

上面应该可以工作(在 C 中,但在 C++ 中你只需要访问最后使用的 union 成员)因为限定和非限定对象必须具有相同的表示和对齐要求,这同样适用于指向兼容类型的限定和非限定版本的指针 ( 6.2.5p28 )。

memcpy(&nonConstBoo,&constBoo,sizeof constBoo);

应该适用于任何一种语言。

关于c - 指向匿名 union 的指针转换在 C11 中有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51231405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com