Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukar C Enum dengan Mudah kepada Rentetan, Mengendalikan Typedefs dan Enum Tanpa Nama?
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& 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; }
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!