c - 指向匿名联合的指针在 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 选项的警告,这是不可取的。
解决方案
不,这是不合法的,原因很简单,强制类型转换只允许用于标量类型,C11 6.5.4“强制转换运算符”:
除非类型名称指定 void 类型,否则类型名称应指定原子的、合格的或不合格的标量类型,并且操作数应具有标量类型。
您的类型是一种union
类型,因此这是违反约束的,任何 C 编译器都不应该接受这一点。
如果你只是想抛弃const
ness,就这样做,那就是 use (Boo*)constBoo
。但请注意,这样做需要您自担风险,施放咒语会告诉编译器您假装知道自己在做什么。
在大多数情况下,当您使用此类转换指针时,程序的行为是未定义的,可能会发生非常糟糕的事情。
推荐阅读
- jquery - 生成随机点击事件
- sql - 重命名名称中包含方括号的索引
- html - 如何在 Angular 中使用嵌套表单并在 Mongodb 中保存数据
- amazon-web-services - 我正在尝试在 AWS 云 9 中包含部分 header.ejs 和 footer.ejs
- ios - 设置 UI 框架在 iPhone X 上无法正常工作;适用于 iPhone 6s
- c# - C# HttpWebRequest “底层连接已关闭:预期保持活动状态的连接已被服务器关闭。”
- groovy - Groovy 中的惰性映射值
- python - Python-将元组列表拆分为子列表
- elasticsearch - Elasticsearch Sink Connector 是否像 JDBC sink 连接器一样支持主键上的 upsert 模式?
- ruby - 如何将黄瓜连接到 oracle 数据库以验证 xml