BOOST_PP_SEQ_ENUM dengan tanda kutip tunggal?

Pada dasarnya saya ingin membagi satu token menjadi beberapa token yang diapit tanda kutip tunggal, tetapi karena ini sepertinya tidak mungkin, saya berhenti di ini. Pada dasarnya:

#include <boost/preprocessor/seq/enum.hpp>

char string[] = {BOOST_PP_SEQ_ENUM((F)(l)(y)(O)(f)(f)(L)(e)(d)(g)(e))};

Namun bagaimana saya bisa menambahkan tanda kutip tunggal?


person AnArrayOfFunctions    schedule 16.02.2019    source sumber
comment
Dimungkinkan untuk membagi string literal menjadi karakter terpisah pada waktu kompiler tanpa makro apa pun.   -  person user7860670    schedule 16.02.2019
comment
@VTT, Hati-hati, tag C++ telah dihapus.   -  person chris    schedule 16.02.2019


Jawaban (2)


Saya tidak percaya membuat karakter literal dalam C yang sesuai standar, lihat C preprocessor: Cara membuat karakter harfiah? .

Namun, jika Anda hanya menginginkan karakter, Anda memiliki beberapa opsi:

  • Anda dapat mengembangkannya menjadi string literal dengan BOOST_PP_STRINGIZE dan BOOST_PP_SEQ_CAT :

    char string[] = BOOST_PP_STRINGIZE(
        BOOST_PP_SEQ_CAT((F)(l)(y)(O)(f)(f)(L)(e)(d)(g)(e)));
    // Equivalent to:
    char string2[] = "FlyOffLedge";
    

    Langsung di Godbolt

  • Anda dapat memperluas setiap karakter menjadi "c"[0]:

    #define TO_CSV_CHARS_OP(s, data, elem) BOOST_PP_STRINGIZE(elem)[0]
    #define TO_CSV_CHARS(seq) \
        BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(TO_CSV_CHARS_OP, , seq))
    
    char string[] = {
        TO_CSV_CHARS((F)(l)(y)(O)(f)(f)(L)(e)(d)(g)(e))
    };
    // Equivalent to:
    char string2[] = {
        "F"[0],
        "l"[0],
        "y"[0],
        "O"[0],
        "f"[0],
        "f"[0],
        "L"[0],
        "e"[0],
        "d"[0],
        "g"[0],
        "e"[0]
    };
    

    Langsung di Godbolt

person Justin    schedule 16.02.2019

Anda dapat mengadaptasi jawaban ini dalam pertanyaan tertaut ke C dengan cukup mudah untuk mencapai tujuan awal (contoh langsung):

#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>

#define GET_CH(s, i) ((i) >= sizeof(s) ? '\0' : (s)[i])

#define STRING_TO_CHARS_EXTRACT(z, n, data) \
        BOOST_PP_COMMA_IF(n) GET_CH(data, n)

#define STRING_TO_CHARS(STRLEN, STR)  \
        BOOST_PP_REPEAT(STRLEN, STRING_TO_CHARS_EXTRACT, STR)

char string[] = {STRING_TO_CHARS(12, "FlyOffLedge")};

Saya rasa di C tidak mungkin menangani panjangnya secara otomatis.

Jika yang Anda cari hanyalah pertanyaan seperti yang diajukan, Anda dapat menggunakan trik seperti pada jawaban Justin untuk mendapatkan karakter pertama dari setiap karakter string tanpa menggunakan sintaks literal karakter (contoh langsung serupa).

person chris    schedule 16.02.2019