BOOST_PP_SEQ_ENUM用单引号引起来?

时间:2019-02-16 17:11:32

标签: c boost macros preprocessor boost-preprocessor

基本上,我想将单个标记拆分为多个用单引号引起来的标记,但是由于这似乎是不可能的,所以我已停止在this上。基本上:

#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 :(得分:2)

我认为无法在符合标准的C语言中创建字符文字,请参见C preprocessor: How to create a character literal?

但是,如果您只想要字符,则确实有一些选择:

  • 您可以使用BOOST_PP_STRINGIZEBOOST_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

答案 1 :(得分:1)

您可以很轻松地使链接问题中的this answer适应C,以实现原始目标(live example):

#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语言不可能自动处理长度。

如果您只是想问的问题,可以使用贾斯汀的答案中的技巧来获取每个字符串化字符的第一个字符,而无需使用字符文字语法(similar live example)。