#include typedef void (*cb_t)(void *, int); typedef cb_t *scb_t; struct cb { cb_t cb; const char *str; }; void cb(void *self, int v) { struct cb *s = self; printf("%s: %d\n", s->str, v); } #define callcb(CB, ...) (*(CB))(CB, __VA_ARGS__) int main(int argc, char *argv[]) { struct cb c = {.cb = cb, .str = "Hello"}; scb_t sc = &c.cb; callcb(sc, 42); }