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: как создать символ буквально? .

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

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