与 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语言对于通过这种联合体去除const限定的规则是什么?我对C语言只有一些零散的了解,但我听说C语言在联合体访问方面比C++宽松得多,因此虽然我对这个构造有些不好的感觉,但我想要一个来自标准(我想是C99,尽管如果在C11中已经改变了,就需要知道)的论据。
void* q = (void*)p
吗? - kennytm