首页 > 解决方案 > 指向匿名联合的指针在 C11 中是否有效?

问题描述

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 选项的警告,这是不可取的。

标签: cc11

解决方案


不,这是不合法的,原因很简单,强制类型转换只允许用于标量类型,C11 6.5.4“强制转换运算符”:

除非类型名称指定 void 类型,否则类型名称应指定原子的、合格的或不合格的标量类型,并且操作数应具有标量类型。

您的类型是一种union类型,因此这是违反约束的,任何 C 编译器都不应该接受这一点。

如果你只是想抛弃constness,就这样做,那就是 use (Boo*)constBoo。但请注意,这样做需要您自担风险,施放咒语会告诉编译器您假装知道自己在做什么。

在大多数情况下,当您使用此类转换指针时,程序的行为是未定义的,可能会发生非常糟糕的事情。


推荐阅读