Sto cercando di ottenere un esempio protobuf-c compilato con un compilatore C90 (MS VS2012).Qual è lo scopo di void * array = * (void **) member + siz * (* p_n);
All'interno del codice sorgente protobuf-c ci sono due cose C99 specifici che possono essere facilmente modificati per essere compatibile con C90, ossia dichiarazione variabili nel mezzo di portata (not allowed in C90) e instantiation of structs tramite il .
-syntax (es some_struct_type name = {.a=1,.b=2}
).
Ora sono bloccato con un errore di compilazione rimasto. La rispettiva linea nel file sorgente 'protobuf-ç.ç' si legge:
void *array = *(void **) member + siz * (*p_n);
Dove member
è definiscono void *
e p_n
come size_t *
. e le rispettive errore è
error C2036: 'void *' : unknown size
Si prega di notare questo vale per protobuf-c versione 1.0.1 (vedi respective source code, alla riga 2404). Questa linea è stata modificata nella versione 1.0.2 per
void *array = *(char **) member + siz * (*p_n);
con this comment. La modifica della linea di conseguenza elimina l'errore di compilazione.
Le mie domande sono:
- vorrei capire questa riga di codice.
- Posso passare alla versione
*(char **)
? - Qual è il messaggio di errore che mi dice?
(per qualche altro motivo che voglio attenersi a protobuf-c 1.0.1)
Sembra che sia progettato per essere illeggibile dagli esseri umani. :) – Almo
Alcuni compilatori trattano il vuoto * simile a BYTE *, almeno nell'aritmetica del puntatore. Ad esempio, sizeof (void *) compila in 1. Vorrei dividere questa riga di clutter nei suoi elementi e sostituire 'void *' con 'char *' * per questo scopo specifico dell'aritmetica del puntatore *. – harper
@harper che cosa leggerebbe il codice se fosse "de-ingombrante" – georg