BOOST_PP_SEQ_ENUM с одинарными кавычками? - PullRequest
0 голосов
/ 16 февраля 2019

В основном я хочу разделить один токен на несколько токенов, заключенных в одинарные кавычки, но так как это кажется невозможным, я остановился на этом .В основном:

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

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

Однако как я могу добавить одинарные кавычки в?

Ответы [ 2 ]

0 голосов
/ 16 февраля 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")};

Я не знаюЯ не думаю, что в Си можно обрабатывать длину автоматически.

Если все, что вам нужно, это вопрос, который задают, вы можете использовать трюк, как в ответе Джастина, чтобы получить первый символ каждого строкового символа без использованиясимвольный буквенный синтаксис ( аналогичный живой пример ).

0 голосов
/ 16 февраля 2019

Я не верю, что возможно создать символ литералы в стандартном совместимом C, см. Препроцессор C: как создать символьный литерал? .

Однако, если вам нужны символы, у вас есть несколько вариантов:

  • Вы можете расширить его до строкового литерала с помощью 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";
    

    Live on 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]
    };
    

    Live on Godbolt

...