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 ?

Comment puis-je facilement convertir des énumérations C en chaînes, en gérant les typedefs et les énumérations sans nom ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-15 21:05:32968parcourir

How Can I Easily Convert C   Enums to Strings, Handling Typedefs and Unnamed Enums?

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&amp; operator<<(std::ostream&amp; 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn