use*_*942 13 c++ pointers void-pointers pointer-arithmetic
我正在编写和读取内存映射中的寄存器,如下所示:
//READ
return *((volatile uint32_t *) ( map + offset ));
//WRITE
*((volatile uint32_t *) ( map + offset )) = value;
Run Code Online (Sandbox Code Playgroud)
但是编译器给了我这样的警告:
warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
Run Code Online (Sandbox Code Playgroud)
如何更改我的代码以删除警告?我正在使用C++和Linux.
Sea*_*ean 22
因为void*是一个指向未知类型的指针,所以你不能对它进行指针运算,因为编译器不知道指向的东西有多大.
你最好的选择是转换map为一个字节宽的类型,然后进行算术运算.你可以使用uint8_t这个:
//READ
return *((volatile uint32_t *) ( ((uint8_t*)map) + offset ));
//WRITE
*((volatile uint32_t *) ( ((uint8_t*)map)+ offset )) = value;
Run Code Online (Sandbox Code Playgroud)
类型void是不完整类型.它的大小不明.因此,使用指向void的指针算法没有任何意义.您必须将指向void类型的指针转换为其他类型的指针,例如指向char的指针.还要考虑到您不能分配使用qualifier volatile声明的对象.