Sie könnten den Prä-Prozessor verwenden, dies zu tun, ich glaube, diese Technik X-Macros genannt wird:
/* fruits.def */
X(APPLE)
X(MANGO)
X(ORANGE)
/* file.c */
enum fruits {
#define X(a) a,
#include "fruits.def"
#undef X
};
const char *fruit_name[] = {
#define X(a) #a,
#include "fruits.def"
#undef X
};
Beachten Sie, dass der letzte Eintrag ein Komma enthält, die in C99 erlaubt ist (aber nicht in C89). Wenn das ein Problem ist, können Sie Sentinal-Werte hinzufügen. Es ist auch möglich, das Makro komplizierter indem sie mehrere Argumente für benutzerdefinierte Namen oder ENUM-Werte zu machen, etc:
X(APPLE, Apple, 2)
#define X(a,b,c) a = c, /* in enum */
#define X(a,b,c) [c] = #b, /* in name array */
Einschränkungen: Sie können keine negativen Konstanten und Ihr Array ist sizeof (char *) * largest_constant
.
Aber Sie könnten Tabelle unter Verwendung eines zusätzlichen Lookup um beide arbeiten:
int map[] = {
#define X(a,b,c) c,
#include "fruits.def"
#undef X
};
Dies ist natürlich nicht funktioniert. Was bedeutet Arbeit für die Namen einen zusätzlichen Satz enum
Konstanten als Schlüssel zu erzeugen:
enum fruits {
#define X(a,b,c) a ## _KEY,
#include "fruits.def"
#undef X
#define X(a,b,c) a = c,
#include "fruits.def"
#undef X
};
Jetzt können Sie den Namen X(PINEAPPLE, Pineapple, -40)
unter Verwendung fruit_name[PINEAPPLE_KEY]
finden.
Die Leute haben festgestellt, dass sie die zusätzliche Include-Datei nicht mögen. Sie benötigen diese zusätzliche Datei nicht, Sie verwenden auch eine #define
. Dies kann besser geeignet für kleine Listen sein:
#define FRUIT_LIST X(APPLE) X(ORANGE)
Und #include "fruits.def
mit FRUIT_LIST
in den vorherigen Beispielen ersetzen.
Mögliche duplizieren http://stackoverflow.com/questions/3342726/c-print-out-enum-value-as-text –
Dies ist ein FAQ ist alles über die Intertubes und meistens wahrscheinlich ein Betrogener hier, obwohl ich nicht überprüft habe. Antwort: Nein, es kann nicht getan werden (ohne durch Reifen zu springen, wie @Naveen suggeriert und das Risiko besteht, aus dem Takt zu geraten. Wenn Sie bereit sind, dieses Risiko einzugehen, scheinen einige Leute diese Lösung zu verwenden. Es ist besser als nichts , aber es ist verlockendes Schicksal ...). – Mawg
@Eugen Constantin Dinca Diese Frage ist nur C++, während das OP hier eine C-Lösung zu haben scheint. – schot