初期化する構造体がいくつかありますが、手動で行うのは面倒です。私はそれに役立つマクロを作成したいと思っています... しかし、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
};
メニュー定義を 1 つの定義に折りたたむ方法はありますか? MENU(blah, menu_frame_blah_button, NULL, menu_frame_blah_display, NULL)
もちろん、拡張することもできますが、次の方法はありますか?
- 短くする(NULLまたは何らかの名前)
ON_BUTTON(...);
構造体の前の fromの必要性を取り除く
MENU(blah, button, NULL, display, NULL)
理想的には、ハンドラーとメニュー構造自体の両方を定義したいと思います。たとえば、最後の項が に展開されないようにする方法がわかりませんON_SWITCH(NULL)
。
それとも、別の方法でアプローチする必要がありますか?