我有一些结构要初始化,手动执行会很乏味。我想创建一个可以帮助我的宏......但我不确定C预处理器是否足够好。
我有代表菜单的结构。它们仅由函数指针组成:
typedef uint8_t (*button_handler) (uint8_t);
typedef void (*pedal_handler) (void);
typedef void (*display_handler) (void);
typedef void (*menu_switch_handler) (void);
#define ON_BUTTON(x) uint8_t menu_frame_##x##_button (uint8_t button)
#define ON_PEDAL(x) void menu_frame_##x##_pedal (void)
#define ON_DISPLAY(x) void menu_frame_##x##_display (void)
#define ON_SWITCH(x) void menu_frame_##x##_switch (void)
typedef struct menu_frame {
button_handler on_button;
pedal_handler on_pedal;
display_handler on_display;
menu_switch_handler on_switch;
} menu_frame;
这允许我将函数和单独的函数编写为(.c 文件):
ON_BUTTON(blah) { ... }
和菜单作为(.h 文件):
ON_BUTTON(blah);
ON_DISPLAY(blah);
menu_frame menu_frame_blah = {
menu_frame_blah_button,
NULL,
menu_frame_blah_display,
NULL
};
有什么方法可以将菜单定义折叠成一个定义吗?我当然可以做一些扩展MENU(blah, menu_frame_blah_button, NULL, menu_frame_blah_display, NULL)
的事情,但是有什么办法:
- 使其更短(NULL 或某个名称)
ON_BUTTON(...);
从结构之前删除需要
理想情况下,我想MENU(blah, button, NULL, display, NULL)
同时定义处理程序和菜单结构本身。例如,我不知道如何防止将最后一个术语扩展为ON_SWITCH(NULL)
.
或者也许我应该以其他方式接近它?