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
Libérer: 2024-12-15 21:05:32
original
1036 Les gens l'ont consulté

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
};
Copier après la connexion

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);
Copier après la connexion

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";
      }
 }
Copier après la connexion

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;
}
Copier après la connexion

Le fichier d'accompagnement "colours.def" contient :

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)
Copier après la connexion

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.
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal