An Bezeichnernamen zur Laufzeit rankommen (speziell Enums)
-
Hi,
weiß jemand eine Möglichkeit, wie ich an die Namen von Enum-Werten zur Laufzeit rankomme?
An den Namen einer Variablen kommt man ja mit dem Präprozessor-Operator #, den Namen eines Types kriege ich mit der type_info-Klasse (oder gibt es in beiden Fällen bessere Möglichkeiten?), aber ich sehe keine Möglichkeit, an den Namen eines Enum-Aufzählwertes zu kommen, also beispielsweise:
enum Enum1 { Montag, Dienstag, }; void func(Enum1 Parameter) { cout << "Heute ist " << GetEnumConstName(Parameter) << endl; }
Um eines vorwegzunehmen: Die folgende Mögichkeit kam mir auch schon in den Sinn:
switch (Enum1) { case Montag: return "Montag"; break; ....
Aber ich suche etwas "solideres".
Kann mir jemand helfen?
-
In der Art?
#include <stdio.h> enum { montag, dienstag, mittwoch, donnerstag, freitag, samstag, sonntag }; static char const * const wt_names[] = { "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag" }; int main(void) { int i; for(i = montag; i <= sonntag; ++i) puts(wt_names[i]); return 0; }
-
Nein, eben nicht.
Das kann jeder, die Namen der Enum-Variablen als Strings ausgeben. Ich meinte: Gibt es einen Weg, irgendwie die Namen der Enums zu kriegen, mit einem bestimmten Funktionsaufruf / Präprozessor-Makro?
Denn dann muss ich gar nichts im Quellcode bzw. dem entsprechenden String ändern, wenn sich mal ein Name eines Aufzählwertes ändert, da ich ja auch keine char-Werte benötige.
-
Um eines vorwegzunehmen: Die folgende Mögichkeit kam mir auch schon in den Sinn:
Code:
switch (Enum1)
{
case Montag: return "Montag"; break;
....
}
Aber ich suche etwas "solideres".Ich glaube, etwas anderes wird Dir kaum übrigbleiben: Schließlich sind das keine Stings die Du da definierst. Darum kann ich mir kaum vorstellen, dass es eine andere Möglichkeit gibt
-
das geht ned
-
schade, trotzdem danke.
-
Natuerlich geht das. Erzaehlt ihm doch nicht sowas.
Du kannst Symbole einer Binary, sofern du sie noch nicht gestrippt hast, abfragen. Ich bin mir zwar nicht 100%ig sicher ob das auch mit Enums geht, sollte aber. Schau dir dazu mal das Linux Binutil "nm" an.
Es waere zwar ein gewaltiger Overkill sowas in deine Applikation einzubauen, wenn du aber Spass daran hast -> wieso nicht?
-
Ein enum wird ähnlich wie eine per #define angelegte Konstante behandelt, darum gibts zur Laufzeit keine Symbole, die du ansehen könntest.
Bei Variablen funktioniert das im übrigen auch nur, wenn du das Programm mit zusätzlichen Symbolen (also für Debugging) kompilierst.Vielleicht klappt es mit dem Präprozessor: Probiers mal mit sowas:
#define NAME(a) #a
Klappt aber nur für Varaiablen- oder Konstantennamen, den Inhalt betrifft es nicht (da der eben nur zur Laufzeit feststeht, und da wiederum die Namen fehlen).
-
[0x[90]| schrieb:
Natuerlich geht das. Erzaehlt ihm doch nicht sowas.
Du kannst Symbole einer Binary, sofern du sie noch nicht gestrippt hast, abfragen. Ich bin mir zwar nicht 100%ig sicher ob das auch mit Enums geht, sollte aber.Nein, es geht nicht! Enums sind nichts anderes als Integrale, und zur Laufzeit gibt es nur noch diese. Die einfachste Möglichkeit ist immer noch eine wie von 0xdeadbeef vorgeschlagene Stringtable, auch wenn's doppelter Aufwand ist. Man kanns aber mit Makros sicher auch etwas wartbarer gestalten.
-
Jo, vielen Dank!