Problemlose Konvertierung von C-Enums in Strings
Angenommen, Sie stoßen in Ihrem C-Code auf benannte Enums:
enum MyEnum { FOO, BAR = 0x50 };
Und Sie suchen nach einem Skript, um jeweils einen Header mit einer Konvertierungsfunktion zu generieren enum:
char* enum_to_string(MyEnum t);
Mit einer einfachen Implementierung wie dieser:
char* enum_to_string(MyEnum t){ switch(t){ case FOO: return "FOO"; case BAR: return "BAR"; default: return "INVALID ENUM"; } }
Jedoch wird es bei typisierten Enumerationen und unbenannten C-Enumerationen schwierig. Schauen wir uns die besten Lösungen an:
X-Macros: The Champion
X-Macros erweisen sich als erste Wahl und bieten eine elegante Lösung:
#include <iostream> enum Colours { # define X(a) a, # include "colours.def" # undef X ColoursCount }; char const* const colours_str[] = { # define X(a) #a, # include "colours.def" # undef X 0 }; std::ostream& operator<<(std::ostream& os, enum Colours c) { if (c >= ColoursCount || c < 0) return os << "???"; return os << colours_str[c]; } int main() { std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl; }
Die Begleitdatei „colours.def“ enthält:
X(Red) X(Green) X(Blue) X(Cyan) X(Yellow) X(Magenta)
Customizing String Ausgabe
Für zusätzliche Flexibilität können Sie die String-Ausgabe optimieren:
#define X(a, b) a, #define X(a, b) b, X(Red, "red") X(Green, "green") // etc.
Das obige ist der detaillierte Inhalt vonWie kann ich C-Enums einfach in Strings konvertieren und Typedefs und unbenannte Enums verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!