警告:算术中使用的'void*'类型的指针

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)

  • 因为`sizeof(char)`被定义为1,所以转换为`char`会更加惯用. (2认同)

Vla*_*cow 6

类型void是不完整类型.它的大小不明.因此,使用指向void的指针算法没有任何意义.您必须将指向void类型的指针转​​换为其他类型的指针,例如指向char的指针.还要考虑到您不能分配使用qualifier volatile声明的对象.