Wenn Ihre Enumerationswerte dicht genug sind, können Sie ein Array definieren, das die Strings enthält und nur nachschlägt (verwenden Sie NULL für jeden übersprungenen Wert und fügen Sie einen speziellen Case-Handler zu Ihrer Suchroutine hinzu).
char *DogList[] = {
"vizsla", /* element 0 */
NULL,
NULL,
NULL,
"terrier", /* element 3 */
...
};
Dies ist ineffizient für spärliche Aufzählungen.
Auch wenn die Enumeration nicht dicht ist, können Sie ein Array von Strukturen verwenden, um die Zuordnung zu halten.
typedef struct DogMaps {
DogType index;
char * name;
} DogMapt;
DogMapt DogMap[] = {
{kVizsla, "vizsla"},
{kTerrier, "terrier"},
{kYellowLab, "yellow lab"},
NULL
};
Der zweite Ansatz ist sehr flexibel, aber es hat eine Suche durch die Zuordnung jedes Mal bedeuten müssen die Daten verwenden. Bei großen Datensätzen sollte anstelle eines Arrays ein B-Tree oder Hash verwendet werden.
Jede Methode kann verallgemeinert werden, um mehr Daten zu verbinden. In der ersten Verwendung ein Array von Strukturen, in der zweiten nur mehr Mitglieder der Struktur hinzufügen.
Sie möchten natürlich verschiedene Handler schreiben, um Ihre Interaktion mit diesen Datenstrukturen zu vereinfachen.
@Hershi Auf jeden Fall separaten Code und Daten. Die obigen Beispiele sollen klar und nicht funktional sein.
Ich weiß, zuzugeben, dass ich immer noch whitespace getrennte flache Dateien für diesen Zweck verwenden, anstatt die Art der strukturierten Eingabe, die Sie ausstellen, aber mein Produktionscode würde so viel von den Daten aus externen Quellen wie möglich lesen.
Warten Sie, ich sehe, dass Sie Code-Generierung meinen.
Sicher. Daran ist nichts falsch.
Ich vermute, wenn auch, dass der OP interessiert war, was den generierte Code soll wie folgt aussehen ...