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 
// 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);
}

你可能感兴趣的:(C语言const void*强转unsigned char*报错:cast from * to * drops const qualifier)