最近在用字节的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,但是更好的办法是局部处理,在谷歌了半天后,找到了两个可行的方案,亲测有效:
- 使用#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
- 其次,借助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);
}