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
     ...
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top