Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menukar Jenis Enum dengan Cekap kepada Rentetan dalam C dan C?

Bagaimana untuk Menukar Jenis Enum dengan Cekap kepada Rentetan dalam C dan C?

Linda Hamilton
Lepaskan: 2024-12-29 22:52:17
asal
236 orang telah melayarinya

How to Efficiently Convert Enum Types to Strings in C and C  ?

Menukar Jenis Enum kepada Rentetan: Panduan Komprehensif

Menukar pembolehubah jenis enum kepada rentetan ialah keperluan biasa dalam pengaturcaraan. Sebagai contoh, ia menjadi perlu apabila mencetak nilai enum dalam format yang boleh dibaca atau apabila menghantarnya sebagai parameter kepada fungsi yang mengharapkan hujah rentetan.

Pendekatan Naif: Penukaran Manual

Satu pendekatan mudah untuk enum penukaran jenis adalah untuk menulis fungsi manual untuk setiap enum. Contohnya, untuk menukar enum jenis OS:

enum OS_type { Linux, Apple, Windows };

inline const char* ToString(OS_type v)
{
    switch (v)
    {
        case Linux:   return "Linux";
        case Apple:   return "Apple";
        case Windows: return "Windows";
        default:      return "[Unknown OS_type]";
    }
}
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini terdedah kepada isu penyelenggaraan apabila bilangan enum meningkat.

Penyelesaian Berasaskan Prapemproses dengan Boost.Preprocessor

Pustaka Boost.Preprocessor menyediakan cara yang lebih elegan dan automatik untuk mengendalikan penukaran jenis enum. Ia menggunakan prapemproses untuk menjana fungsi penukaran secara dinamik. Dua makro berikut mencapai matlamat ini:

#define X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE(r, data, elem) \
    case elem : return BOOST_PP_STRINGIZE(elem);

#define DEFINE_ENUM_WITH_STRING_CONVERSIONS(name, enumerators) \
    enum name { \
        BOOST_PP_SEQ_ENUM(enumerators) \
    }; \
    \
    inline const char* ToString(name v) \
    { \
        switch (v) \
        { \
            BOOST_PP_SEQ_FOR_EACH( \
                X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE, \
                name, \
                enumerators \
            ) \
            default: return "[Unknown " BOOST_PP_STRINGIZE(name) "]"; \
        } \
    }
Salin selepas log masuk

Menggunakan makro ini, enum OS_type boleh ditakrifkan seperti berikut:

DEFINE_ENUM_WITH_STRING_CONVERSIONS(OS_type, (Linux)(Apple)(Windows))
Salin selepas log masuk

Penggunaan dalam C dan C

Dalam C , fungsi ToString boleh digunakan untuk menukar nilai enum kepada rentetan:

#include <iostream>

int main()
{
    OS_type t = Windows;
    std::cout << ToString(t) << " " << ToString(Apple) << std::endl;
}
Salin selepas log masuk

Untuk C, fungsi ToString boleh dilaksanakan sebagai makro dan bukannya lebihan fungsi:

#define ToString(t) \
    [Unknown ""##t] [Linux "Linux"] [Apple "Apple"] [Windows "Windows"]
Salin selepas log masuk

Kesimpulan

Artikel ini telah membentangkan dua kaedah untuk menukar pembolehubah jenis enum kepada rentetan: pendekatan naif menggunakan fungsi manual dan penyelesaian berasaskan prapemproses dengan Boost.Preprocessor. Pendekatan berasaskan prapemproses lebih teguh dan lebih mudah diselenggara, terutamanya apabila berurusan dengan sejumlah besar enum.

Atas ialah kandungan terperinci Bagaimana untuk Menukar Jenis Enum dengan Cekap kepada Rentetan dalam C dan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan