我有一些結構初始化,這將是手動操作繁瑣。我想創建一個可以幫助我的宏...但是我不確定預處理器是否足夠滿足這個要求。通過宏過度使用結構初始化
我有代表菜單的結構。他們只包含一個函數指針:
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)
。
或者我應該從其他方式來處理它?
你想寫一個C版本的MFC嗎? ;-) – 2010-07-15 20:17:10
也許:)其實一些嵌入的東西與不同的菜單狀態加載(足夠寫很多行ON_BUTTON(some_other_state))。 – viraptor 2010-07-15 20:19:30