BOOST_PP_SEQ_ENUM ด้วยเครื่องหมายคำพูดเดี่ยว?

โดยพื้นฐานแล้วฉันต้องการแยกโทเค็นเดียวออกเป็นหลายโทเค็นที่อยู่ในเครื่องหมายคำพูดเดียว แต่เนื่องจากดูเหมือนว่าจะเป็นไปไม่ได้ ฉันจึงหยุดที่สิ่งนี้ โดยพื้นฐานแล้ว:

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

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

อย่างไรก็ตาม ฉันจะเพิ่มเครื่องหมายคำพูดเดี่ยวเข้าไปได้อย่างไร


person AnArrayOfFunctions    schedule 16.02.2019    source แหล่งที่มา
comment
เป็นไปได้ที่จะแยกสตริงลิเทอรัลออกเป็นตัวอักษรแยกกันในเวลาคอมไพเลอร์โดยไม่ต้องใช้มาโครใดๆ   -  person user7860670    schedule 16.02.2019
comment
@VTT ระวัง แท็ก C++ ถูกลบแล้ว   -  person chris    schedule 16.02.2019


คำตอบ (2)


ฉันไม่เชื่อว่าเป็นไปได้ที่จะสร้างอักขระ ตัวอักษร ใน C ที่เป็นไปตามมาตรฐาน ดูที่ ตัวประมวลผลล่วงหน้า C: วิธีสร้างอักขระ แท้จริง? .

อย่างไรก็ตาม หากคุณต้องการเพียงตัวละคร คุณมีทางเลือก 2-3 ทาง:

  • คุณสามารถขยายเป็นสตริงตัวอักษรได้ด้วย BOOST_PP_STRINGIZE และ 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";
    

    ถ่ายทอดสดบน Godbolt

  • คุณสามารถขยายอักขระแต่ละตัวเป็น "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]
    };
    

    ถ่ายทอดสดบน Godbolt

person Justin    schedule 16.02.2019

คุณสามารถปรับใช้คำตอบนี้ในคำถามที่เชื่อมโยงกับ C ได้อย่างง่ายดายเพื่อให้บรรลุเป้าหมายเดิม (ตัวอย่างสด):

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

ฉันไม่คิดว่าเป็นไปได้ใน C ที่จะจัดการความยาวโดยอัตโนมัติ

หากสิ่งที่คุณต้องการคือคำถามตามที่ถาม คุณสามารถใช้เคล็ดลับเหมือนในคำตอบของจัสตินเพื่อรับอักขระตัวแรกของอักขระสตริงแต่ละตัวโดยไม่ต้องใช้ไวยากรณ์ตัวอักษร (ตัวอย่างสดที่คล้ายกัน)

person chris    schedule 16.02.2019