【发布时间】:2010-07-15 20:14:08
【问题描述】:
我有一些结构要初始化,手动操作会很乏味。我想创建一个宏来帮助我...但我不确定 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)。
或者我应该以其他方式接近它?
【问题讨论】:
-
您是否正在尝试编写 MFC 的 C 版本? ;-)
-
可能 :) 实际上一些嵌入的东西有很多不同的菜单状态(写很多行 ON_BUTTON(some_other_state) 就够愚蠢了)。
标签: c struct macros c-preprocessor stringification