J'ai quelques structures à initialiser, ce qui serait fastidieux à faire manuellement. Je voudrais créer une macro qui va m'aider avec ça ... mais je ne suis pas sûr que le préprocesseur C est assez bon pour ça.Initialisation de la structure par l'utilisation excessive de la macro
J'ai des structures qui représentent des menus. Ils consistent en des pointeurs de fonction seulement:
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;
Cela me permet d'écrire les fonctions et les fonctions séparées que (fichier .c):
ON_BUTTON(blah) { ... }
et menus comme (.h):
ON_BUTTON(blah);
ON_DISPLAY(blah);
menu_frame menu_frame_blah = {
menu_frame_blah_button,
NULL,
menu_frame_blah_display,
NULL
};
Y at-il un moyen de plier la définition du menu en une définition? Je pouvais faire quelque chose qui se développe MENU(blah, menu_frame_blah_button, NULL, menu_frame_blah_display, NULL)
bien sûr, mais est-il possible de:
- rendent plus court (NULL ou un nom)
- supprimer la nécessité de
ON_BUTTON(...);
d'avant la struct
Idéalement, j'aimerais que MENU(blah, button, NULL, display, NULL)
définisse à la fois les gestionnaires et le menu struct lui-même. Je ne sais pas par exemple comment empêcher l'extension du dernier terme en ON_SWITCH(NULL)
.
Ou peut-être que je devrais l'aborder d'une autre manière?
Essayez-vous d'écrire une version C de MFC? ;-) –
Probablement :) En fait quelques trucs incorporés avec des charges de différents états de menu (assez qu'il serait stupide d'écrire beaucoup de lignes de ON_BUTTON (some_other_state)). – viraptor