简体   繁体   English

如何将数组解压缩为单独的宏参数?

[英]How can I unpack an array as separate macro arguments?

I am using the qmk library, which has a LAYOUT macro that takes many parameters.我正在使用qmk库,它有一个带有许多参数的LAYOUT宏。 It is used like so (with KC_xxx etc constants):它像这样使用(使用KC_xxx等常量):

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[baselayer] = LAYOUT( /* Dvorak without modifiers. Never switched to, just as base for the combos*/
    KC_QUOT   ,KC_COMM   ,KC_DOT    ,KC_P      ,KC_Y     ,                      KC_F      ,KC_G      ,KC_C      ,KC_R      ,KC_L      ,
    KC_A      ,KC_O      ,KC_E      ,KC_U      ,KC_I     ,                      KC_D      ,KC_H      ,KC_T      ,KC_N      ,KC_S      ,
    KC_SCLN   ,KC_Q      ,KC_J      ,KC_K      ,KC_X     ,XXXXXXX   ,XXXXXXX   ,KC_B      ,KC_M      ,KC_W      ,KC_V      ,KC_Z      ,
    XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX  ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX
), 
//... more layers
};

I'd like to split this code in an array and use that in the macro call:我想将此代码拆分为一个数组并在宏调用中使用它:

//define the array
const uint16_t BASE[] = {
    KC_QUOT   ,KC_COMM   ,KC_DOT    ,KC_P      ,KC_Y     ,                      KC_F      ,KC_G      ,KC_C      ,KC_R      ,KC_L      ,
    KC_A      ,KC_O      ,KC_E      ,KC_U      ,KC_I     ,                      KC_D      ,KC_H      ,KC_T      ,KC_N      ,KC_S      ,
    KC_SCLN   ,KC_Q      ,KC_J      ,KC_K      ,KC_X     ,XXXXXXX   ,XXXXXXX   ,KC_B      ,KC_M      ,KC_W      ,KC_V      ,KC_Z      ,
    XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX  ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX
};

// TODO: manipulate array

//use the array
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[baselayer] = LAYOUT(BASE), // <-- how to write this line?
//... more layers
};

How do I change the indicated line of code so that the array BASE is unpacked and its elements used as the macro arguments?如何更改指示的代码行,以便解压缩数组BASE并将其元素用作宏参数?

Currently the compiler tells me目前编译器告诉我

error: macro "LAYOUT" requires 44 arguments, but only 1 given错误:宏“LAYOUT”需要 44 个参数,但只有 1 个给定

LAYOUT is a C preprocessor macro. LAYOUT是一个 C 预处理器宏。 You can't apply array to a C preprocessor macro.您不能将数组应用于 C 预处理器宏。 It has to stay in preprocessor world.它必须留在预处理器世界中。

#define BASE \
    KC_QUOT   ,KC_COMM   ,KC_DOT    ,KC_P      ,KC_Y     ,                      KC_F      ,KC_G      ,KC_C      ,KC_R      ,KC_L      , \
    KC_A      ,KC_O      ,KC_E      ,KC_U      ,KC_I     ,                      KC_D      ,KC_H      ,KC_T      ,KC_N      ,KC_S      , \
    KC_SCLN   ,KC_Q      ,KC_J      ,KC_K      ,KC_X     ,XXXXXXX   ,XXXXXXX   ,KC_B      ,KC_M      ,KC_W      ,KC_V      ,KC_Z      , \
    XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX  ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX

#define EXPAND_THEN_LAYOUT(x)  LAYOUT(x)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [baselayer] = EXPAND_THEN_LAYOUT(BASE),
};

I think I would do:我想我会这样做:

/// Dvorak without modifiers. Never switched to, just as base for the combos.
#define BASE_LAYOUT() LAYOUT( \
KC_QUOT   ,KC_COMM   ,KC_DOT    ,KC_P      ,KC_Y     ,                      KC_F      ,KC_G      ,KC_C      ,KC_R      ,KC_L      , \
KC_A      ,KC_O      ,KC_E      ,KC_U      ,KC_I     ,                      KC_D      ,KC_H      ,KC_T      ,KC_N      ,KC_S      , \
KC_SCLN   ,KC_Q      ,KC_J      ,KC_K      ,KC_X     ,XXXXXXX   ,XXXXXXX   ,KC_B      ,KC_M      ,KC_W      ,KC_V      ,KC_Z      , \
XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX  ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX \
)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [baselayer] = BASE_LAYOUT(),
};

See What is the the best way to ask follow up questions?请参阅提出后续问题的最佳方式是什么? . .

I want to insert a few values at certain index positions我想在某些索引位置插入一些值

Write a macro that replaces a certain position.编写一个替换某个位置的宏。

#define CHANGE_5_to_XXXX_IN(_1, _2, _3, _4, _5, ...) \
     _1, _2, _3, _4, XXXX, __VA_ARGS__
#define CHANGE_5_to_XXXX(...)  CHANGE_5_to_XXXX_IN(__VA_ARGS__)

EXPAND_THEN_LAYOUT(CHANGE_5_to_XXXX(BASE))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM