Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukar C Enum dengan Mudah kepada Rentetan, Mengendalikan Typedefs dan Enum Tanpa Nama?

Bagaimanakah Saya Boleh Menukar C Enum dengan Mudah kepada Rentetan, Mengendalikan Typedefs dan Enum Tanpa Nama?

Patricia Arquette
Patricia Arquetteasal
2024-12-15 21:05:32964semak imbas

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

Penukaran Enum C Tanpa Kerumitan kepada Rentetan

Andaikan anda menemui enum bernama dalam kod C anda:

enum MyEnum {
      FOO,
      BAR = 0x50
};

Dan anda mencari skrip untuk menjana pengepala yang menampilkan fungsi penukaran untuk setiap satu enum:

char* enum_to_string(MyEnum t);

Dengan pelaksanaan yang mudah seperti ini:

char* enum_to_string(MyEnum t){
      switch(t){
         case FOO:
            return "FOO";
         case BAR:
            return "BAR";
         default:
            return "INVALID ENUM";
      }
 }

Walau bagaimanapun, keadaan menjadi rumit dengan enum taip dan enum C yang tidak dinamakan. Mari kita mendalami penyelesaian terbaik:

X-Macros: The Champion

X-macros muncul sebagai pilihan utama, menawarkan penyelesaian yang elegan:

#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;
}

Fail yang disertakan "colours.def" memegang:

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)

Menyesuaikan Output Rentetan

Untuk fleksibiliti tambahan, anda boleh tweak output rentetan:

#define X(a, b) a,
#define X(a, b) b,

X(Red, "red")
X(Green, "green")
// etc.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar C Enum dengan Mudah kepada Rentetan, Mengendalikan Typedefs dan Enum Tanpa Nama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn