【发布时间】:2018-07-08 11:13:31
【问题描述】:
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 选项的警告,这是不可取的。
【问题讨论】:
-
你有什么理由不想直接做演员?
-
它不能用 -Wcast-qual 编译。这基本上是一种在 C 中从 C++ 编写 const_cast 而不会触发警告的显式方式。不幸的是,一些外部库没有正确定义函数原型,因此进行强制转换是不可避免的,但同时为其余代码启用警告是合理的。
-
GCC 将发出
-pedantic-errors的错误:“错误:ISO C 禁止强制转换为联合类型 [-Wpedantic]” 还建议改写:我读到您的问题是询问指向联合的指针。 :) -
嗯,有趣,我想我错过了那个警告。让我重新表述一下这个问题:-) 您是否还指定了 -std=c11?什么 GCC 版本?
-
@FilipNavara 是的,这是 GCC 8.1 的
-std=c11 -pedantic-errors,但与 GCC 4.7 的结果相同,第一个识别-std=c11。