Maison >développement back-end >C++ >Comment puis-je facilement convertir des énumérations C en chaînes, en gérant les typedefs et les énumérations sans nom ?
Conversion d'énumérations C sans tracas en chaînes
Supposons que vous rencontriez des énumérations nommées dans votre code C :
enum MyEnum { FOO, BAR = 0x50 };
Et vous cherchez un script pour générer un en-tête comportant une fonction de conversion pour chacun enum :
char* enum_to_string(MyEnum t);
Avec une implémentation simple comme celle-ci :
char* enum_to_string(MyEnum t){ switch(t){ case FOO: return "FOO"; case BAR: return "BAR"; default: return "INVALID ENUM"; } }
Cependant, les choses se compliquent avec les énumérations typées et les énumérations C sans nom. Examinons les meilleures solutions :
X-Macros : le champion
Les X-macros émergent comme le premier choix, offrant une solution élégante :
#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; }
Le fichier d'accompagnement "colours.def" contient :
X(Red) X(Green) X(Blue) X(Cyan) X(Yellow) X(Magenta)
Chaîne de personnalisation Sortie
Pour plus de flexibilité, vous pouvez modifier la sortie de la chaîne :
#define X(a, b) a, #define X(a, b) b, X(Red, "red") X(Green, "green") // etc.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!