Ich versuche, ein protobuf-c Beispiel mit einem C90 Compiler (MS VS2012) kompiliert zu bekommen.Was ist der Zweck von void * array = * (void **) member + siz * (* p_n);
Innerhalb der Quellcodes protobuf-c gibt es zwei C99 bestimmte Dinge, die leicht mit C90, dh Variablendeklaration in der Mitte einen Umfang kompatibel zu sein (not allowed in C90) und instantiation of structs über die .
-Syntax (zB some_struct_type name = {.a=1,.b=2}
geändert werden können).
Ich bin jetzt mit einem Kompilierungsfehler stecken geblieben. Die entsprechende Zeile in der Quelldatei 'protobuf-C.C' lautet:
void *array = *(void **) member + siz * (*p_n);
Wo member
ist als void *
und p_n
als size_t *
definieren. Und der entsprechende Fehler ist
error C2036: 'void *' : unknown size
Bitte beachten Sie, dies gilt für protobuf-c Version 1.0.1 (siehe respective source code, in Zeile 2404). Diese Linie wird in Version 1.0.2 zu
void *array = *(char **) member + siz * (*p_n);
mit this comment geändert. Wenn Sie die Zeile entsprechend ändern, entfällt der Kompilierungsfehler.
Meine Fragen sind:
- ich diese Zeile Code verstehen möchten.
- Kann ich zur
*(char **)
Version wechseln? - Was sagt mir die Fehlermeldung?
(Aus irgendeinem anderen Grund, warum ich protobuf-c 1.0.1 haften möchten)
Sieht aus, als ob es von Menschen nicht lesbar ist. :) – Almo
Es gibt einige Compiler, die void * ähnlich wie BYTE * behandeln, zumindest in der Zeigerarithmetik. d. h. sizeof (void *) kompiliert zu 1. Ich würde diese Clutter-Linie in ihre Elemente aufteilen und 'void *' durch 'char *' * für diesen speziellen Zweck der Zeigerarithmetik * ersetzen. – harper
@harper was würde der Code lesen, wenn er "entstörte" – georg