Viele Leute hier haben vorgeschlagen, die Anzahl der Parameter zu übergeben, aber andere merken zu Recht an, dass dies zu heimtückischen Fehlern führt, bei denen sich die Anzahl der Felder ändert, aber die Anzahl, die an die vararg-Funktion übergeben wird, nicht. Ich löse dies in einem Produkt, indem ich stattdessen eine Nullterminierung verwende:
send_info(INFO_NUMBER,
Some_Field, 23,
Some_other_Field, "more data",
NULL);
Auf diese Weise ist es unwahrscheinlich, dass Programmierer beim Kopieren und Einfügen etwas falsch machen. Und was noch wichtiger ist: Ich werde es wahrscheinlich nicht vermasseln.
Zurück zum ursprünglichen Problem: Sie haben eine Funktion, die eine Struktur mit vielen Feldern aktualisieren muss, und die Struktur wird wachsen. Die übliche Methode (in den klassischen Win32- und MacOS-APIs) zur Übergabe von Daten dieser Art an eine Funktion ist die Übergabe einer anderen Struktur (kann sogar die gleiche Struktur sein wie die, die Sie aktualisieren), d.h.:
void update(UPDATESTRUCTURE *update_info);
um es zu verwenden, müssen Sie die Felder ausfüllen:
UPDATESTRUCTURE my_update = {
UPDATESTRUCTURE_V1,
field_1,
field_2
};
update( &my_update );
Wenn Sie später neue Felder hinzufügen, können Sie die UPDATESTRUCTURE-Definition aktualisieren und neu kompilieren. Indem Sie die Versionsnummer angeben, können Sie älteren Code unterstützen, der die neuen Felder nicht verwendet.
Eine Variante des Themas ist es, einen Wert für Felder zu haben, die nicht aktualisiert werden sollen, wie KEEP_OLD_VALUE (idealerweise ist dies 0) oder NULL.
UPDATESTRUCTURE my_update = {
field_1,
NULL,
field_3
};
update( &my_update);
Ich füge keine Version ein, weil ich die Tatsache ausnutze, dass, wenn wir die Anzahl der Felder in UPDATESTRUCTURE erhöhen, die zusätzlichen Felder auf 0 initialisiert werden, oder KEEP_OLD_VALUE.