【发布时间】:2012-02-08 19:42:20
【问题描述】:
与 C++ 不同,C 没有const_cast 的概念。也就是说,没有有效的方法将 const 限定指针转换为非限定指针:
void const * p;
void * q = p; // not good
首先:这种转换实际上是未定义的行为吗?
无论如何,GCC 都会对此发出警告。为了制作需要 const-cast 的“干净”代码(即我可以保证我不会改变内容,但我所拥有的只是一个可变指针),我看到了以下“转换”技巧:
typedef union constcaster_
{
void * mp;
void const * cp;
} constcaster;
用法:u.cp = p; q = u.mp;。
C 语言通过这样的联合抛弃常量的规则是什么?我对 C 的了解非常零碎,但我听说 C 在联合访问方面比 C++ 宽松得多,所以虽然我对这种结构有不好的感觉,但我想从标准中得到一个论据(我想是 C99,不过如果这在 C11 中发生了变化,那就太好了)。
【问题讨论】:
-
你的意思是第一个代码块中的
void* q = (void*)p? -
@KennyTM:是的——我需要明确的演员表吗,和/或有什么不同吗?
-
没有隐式转换 gcc 会警告丢弃限定符。但是 gcc 仍然报告错误(“初始化元素不是常量”),即使使用强制转换。
标签: c constants language-lawyer unions