L'errore che esegue l'aritmetica dei puntatori su * vuoto in MSVC
-
29-09-2019 - |
Domanda
Error 1 error C2036: 'const void *' : unknown size file.cpp 111
non seguo. GCC non si lamenta mai void * aritmetica dei puntatori, anche su -ansi -pedantic -Wall
. Qual è il problema?
Ecco il code-
struct MyStruct {
const void *buf; // Pointer to buffer
const void *bufpos; // Pointer to current position in buffer
};
...
size_t someSize_t, anotherSize_t;
MyStruct *myStruct = (MyStruct *) userdata;
...
if ( (myStruct->bufpos + someSize_t) >
(myStruct->buf + anotherSize_t) ) { // Error on this line
...
Soluzione
Non si può fare la matematica puntatore su un puntatore void *
. Fusioni e oData->bufpos
oData->anotherConstVoidPtr
a qualcosa il compilatore sa come affrontare. Dal momento che ti sembra di essere alla ricerca di dimensioni, che sono presumibilmente in byte, colata a char *
dovrebbe funzionare:
if (((char *)oData->bufpos + someSize_t) ...
Altri suggerimenti
Nella riga:
if ( oData->bufpos ...
Il tipo di bufpos è ancora void *. Il compilatore non sa cosa che i punti di puntatore, quindi ti dà quell'errore.
Per l'aritmetica dei puntatori, void * non ha dimensioni, in modo da prendere un offset, o fare altro aritmetica dei puntatori non ha senso. Cast a char * se si vuole compensarlo con un numero di byte:
if(((char*)oData->bufpos) + offset ...
A cura dopo più di codice / contesto è stato dato
Se si può farne a meno, provare a utilizzare char * invece di * vuoto. La gente in C-terra sapranno che cosa si sta parlando, perché i caratteri sono byte, e potrai risparmiare il mal di testa di getto.
$ 3.9.1 / 9- Il tipo void è un insieme vuoto di valori. Il tipo void è un tipo incompleto che non può essere completata. È usato come il tipo di ritorno per le funzioni che non restituiscono un valore. Qualsiasi espressione può essere esplicitamente convertito nel tipo cv vuoto (5.4). Un'espressione di tipo void è utilizzato soltanto come istruzione di espressione (6.2), come operando di un'espressione virgola (5,18), come seconda o terza operando di: (5.16), come operando di typeid, o come il espressione in un'istruzione return (6.6.3) per una funzione con il tipo restituito vuoto.
ho il sospetto di un uso improprio di 'vuoto' al di là di ciò che è consentito dalla norma.