Существует некий функционал
упрощённо так:
// put data pointer to 'data' to the stack
void *st_add(stack *st, void *data);
Соответственно в таком виде использовать сие не удобно никак.
Допустим у нас есть Mtype размером sizeof(Mtype)
// usage:
Mtype var1;
stack s;
...
st_add(&s, &var1);
Соответственно идея в том, что-бы создать обёртку (временная нужна для корректной работы с литералами и в контексте вопроса это не принципиально):
#define st_add_Mtype(st, data)\
{ Mtype _tmp_var = data;\
st_add(&st, &_tmp_var);\
}
и тогда получается красиво:
// usage via wrapper:
Mtype var1;
stack s;
...
st_add_Mtype(s, var1);
Соответственно проблема в том, что если для базовых типов эти обёртки можно создать ручками, то для своих структурок приходится уныло копипастить и вообще всё время помнить, про особенности реализации.
Соответственно хотелось бы чего-то вроде такого:
// generate wrappers for newly defined type Mtype
st_wrapper_generate(Mtype); // macros, which have to create auxillary for type
но реализация не позволяет в макросах создавать новые макросы. Максимум что можно, это static inline функции.
Соответственно вопрос к знатокам, можно как-то корректно и без привлечения всяких м4 решить вышеуказанную проблему?