C语言const void*强转unsigned char*报错:cast from * to * drops const qualifier

最近在用字节的bytehook写代码时,需要修改const void *buf指向的内容,因此需要先对const的buf指针做强转去掉const:

static void encrypt(const void *buf, size_t count) {
    (void) count;
    unsigned char *_buf = (unsigned char *) buf;
}

如果这么写,就会提示error: cast from 'const void *' to 'unsigned char *' drops const qualifier [-Werror,-Wcast-qual]
虽然我也可以全局修改CMakeLists.txt,但是更好的办法是局部处理,在谷歌了半天后,找到了两个可行的方案,亲测有效:

  1. 使用#pragma,需要GCC 4.6以上
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
void foo(){
    const char* ptr = buf;
    char* q = (char*)ptr;
}
#pragma GCC diagnostic pop
  1. 其次,借助uintptr_t
#include <stdint.h>
// uintptr_t:用来存放指针地址,提供了一种可移植且安全的方法声明指针
#define UN_CONSTIFY(_t, _v) ((_t)(uintptr_t)(_v))
void foo(){
    const void* ptr = buf;
    unsigned char *_buf = UN_CONSTIFY(unsigned char *, buf);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容