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

标签 c c11

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/

相关文章:

c++ - 遵守 C\C++ 标准有哪些责任?

c - 可以使用 C11 栅栏来推理其他线程的写入吗?

在 C 中创建最大大小文件 : drive (OS drive) fails

c - 使用函数将角度从度数转换为 C 中的弧度

c - [QuickSort]递归问题

与 C 中的 bool 变量比较

c - 带栅栏的 SPSC 线程安全

c - 调试宏奇怪的行为

c - 在结构体中写入数组

c - Mingw-w64 C版本支持吗?