web-dev-qa-db-ja.com

警告:「void *」型のポインタが算術で使用されています

私はこのようにメモリマップからレジスタを読み書きしています:

//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を使用しています。

14
user1876942

void*は、不明な型へのポインターです。コンパイラーは、ポイントされたものがどれほど大きいかわからないため、ポインターの計算を行うことはできません。

最善の策は、mapをバイト幅の型にキャストしてから、計算を行うことです。 uint8_t この場合:

//READ
return *((volatile uint32_t *) ( ((uint8_t*)map) + offset ));

//WRITE
*((volatile uint32_t *) ( ((uint8_t*)map)+ offset )) = value;
23
Sean

タイプvoidは不完全なタイプです。サイズは不明です。そのため、voidへのポインターを使用したポインター演算には意味がありません。 void型へのポインターを、charへのポインターなどの他の型のポインターにキャストする必要があります。また、修飾子volatileで宣言されたオブジェクトを割り当てられない場合があることも考慮してください。

7

Voidポインターでの算術の使用がGCCによって可能になったために本当に必要な場合( 算術void-および関数ポインター を参照)、-Wno-pointer-arithを使用して警告を抑制できます。 。

3
Damien