У нас есть код типа
#define FUNC_BEGIN(name) \
static some_struct_t s_##name; \
static void init_##name() { \
s_##name.init_func=init_##name; \
int index=0;
#define FUNC_END() }
#define ADD_INT32(name) \
s_##name.list[index].type=type_int32; \
s_##name.list[index].ptr=&name;
#define ADD_STR(name) \
s_##name.list[index].type=type_str; \
s_##name.list[index].ptr=name;
// тут дальше много разных типов
static int32_t var1;
static char var2[100];
FUNC_BEGIN(f1)
ADD_INT32(var1);
ADD_STR(var2);
FUNC_END
// И таких функций в программе штук 300.
typedef struct {
void* ptr;
int16_t type;
const var_rec_t* prev;
} var_rec_t;
static var_rec_t init_var1={&var1, type_int32, NULL};
static var_rec_t init_var2={var2, type_str, &init_var1};