如何将数组解压缩为单独的宏参数?
How can I unpack an array as separate macro arguments?
我正在使用 qmk
库,它有一个带有许多参数的 LAYOUT
宏。它像这样使用(使用 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
};
我想将这段代码拆分成一个数组并在宏调用中使用它:
//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
};
如何更改指示的代码行,以便解压缩数组 BASE
并将其元素用作宏参数?
目前编译器告诉我
error: macro "LAYOUT" requires 44 arguments, but only 1 given
LAYOUT
是一个 C 预处理器宏。您不能将数组应用于 C 预处理器宏。它必须留在预处理器世界中。
#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),
};
我想我会这样做:
/// 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(),
};
参见 What is the the best way to ask follow up questions?。
I want to insert a few values at certain index positions
写一个替换某个位置的宏
#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))
我正在使用 qmk
库,它有一个带有许多参数的 LAYOUT
宏。它像这样使用(使用 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
};
我想将这段代码拆分成一个数组并在宏调用中使用它:
//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
};
如何更改指示的代码行,以便解压缩数组 BASE
并将其元素用作宏参数?
目前编译器告诉我
error: macro "LAYOUT" requires 44 arguments, but only 1 given
LAYOUT
是一个 C 预处理器宏。您不能将数组应用于 C 预处理器宏。它必须留在预处理器世界中。
#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),
};
我想我会这样做:
/// 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(),
};
参见 What is the the best way to ask follow up questions?。
I want to insert a few values at certain index positions
写一个替换某个位置的宏
#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))