ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
1059237 Топик полностью
Dingo (10.12.2020 08:31, просмотров: 529) ответил Vit на Что-то намешалось
Блин, не отпускает... Я ещё и о существовании XMACRO вспомнил. 

Интересно, это юзабельно?

void FooTaskName0(unsigned int flags) { printf("From 0\n"); }
void FooTaskName1(unsigned int flags) {; }
void FooTaskName2(unsigned int flags) {; }

typedef void (*task_fun_ptr)(unsigned int flags);
typedef struct task_t{
task_fun_ptr func;
int rules;
}task_t;

#define TASKLIST \
T(FooTaskName0) \
T(FooTaskName1) \
T(FooTaskName2)

// потом использовать в функции как имя задачи
#define TASK(task) task##_enum

#define T(name) FN(name) E(name)

#define FN(name)
#define E(name) name##_enum,
enum t_itm{ TASKLIST TASKCOUNT };

#undef E
#define E(name)
#undef FN
#define FN(name) {.func=&name, .rules=0},
task_t task_collection[TASKCOUNT] = { TASKLIST };



Развернуло так:


void FooTaskName0(unsigned int flags) { printf("From 0\n"); }
void FooTaskName1(unsigned int flags) {; }
void FooTaskName2(unsigned int flags) {; }

typedef void (*task_fun_ptr)(unsigned int flags);
typedef struct task_t{
task_fun_ptr func;
int rules;
}task_t;
enum t_itm{ FooTaskName0_enum, FooTaskName1_enum, FooTaskName2_enum, TASKCOUNT };


task_t task_collection[TASKCOUNT] = { {.func=&FooTaskName0, .rules=0}, {.func=&FooTaskName1, .rules=0}, {.func=&FooTaskName2, .rules=0}, };