wake-up-neo.com

warnung: Zeiger vom Typ 'void *', der in der Arithmetik verwendet wird

Ich schreibe und lese Register aus einer Memory-Map wie folgt:

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

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

Der Compiler gibt mir jedoch folgende Warnungen:

warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]

Wie kann ich meinen Code ändern, um die Warnungen zu entfernen? Ich verwende C++ und Linux.

11
user1876942

Da void* ein Zeiger auf einen unbekannten Typ ist, können Sie keine Zeigerarithmetik darauf ausführen, da der Compiler nicht wissen würde, wie groß das betreffende Ding ist.

Ihre beste Wette ist, map in einen Byteweiten Typ umzuwandeln und dann die Arithmetik durchzuführen. Sie können uint8_t dafür verwenden:

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

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

Der Typ void ist ein unvollständiger Typ. Ihre Größe ist unbekannt. Die Zeigerarithmetik mit Zeigern auf leer hat also keinen Sinn. Sie müssen den Zeiger in Typ void in einen Zeiger eines anderen Typs umwandeln, z. B. in Zeiger auf char. Berücksichtigen Sie auch, dass Sie möglicherweise kein Objekt mit dem Qualifier Volatile deklarieren dürfen.

6

Wenn Sie die Verwendung von Arithmetik für Leerzeiger wirklich wollen, da GCC dies ermöglicht (siehe Arithmetik für Leer- und Funktionszeiger ), können Sie die Warnung mit -Wno-pointer-arith unterdrücken.

1
Damien