我正在从内存映射中编写和读取寄存器,如下所示:
//READ
return *((volatile uint32_t *) ( map + offset ));
//WRITE
*((volatile uint32_t *) ( map + offset )) = value;
然而编译器给我这样的警告:
warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
如何更改代码以删除警告?我正在使用C ++和Linux。
答案 0 :(得分:19)
由于void*
是指向未知类型的指针,因此您无法对其进行指针运算,因为编译器无法知道该指针的大小。
最好的办法是将map
转换为字节宽的类型,然后进行算术运算。您可以使用uint8_t
:
//READ
return *((volatile uint32_t *) ( ((uint8_t*)map) + offset ));
//WRITE
*((volatile uint32_t *) ( ((uint8_t*)map)+ offset )) = value;
答案 1 :(得分:6)
类型void是不完整的类型。它的大小不明。因此,使用指向void的指针算法没有任何意义。您必须将指向void类型的指针转换为其他类型的指针,例如指向char的指针。 还要考虑到您不能分配使用限定符volatile声明的对象。
答案 2 :(得分:1)
如果确实要在void指针上使用算术,因为GCC可以使它成为可能(请参阅Arithmetic on void- and Function-Pointers),则可以使用-Wno-pointer-arith
来抑制警告。