There is no easy way around this, since the compiler needs to check the call matches the function signature. You could define each function to take a
void*
as its only parameter and then cast it internally to the correct structure. Or you could use the varargs option where you pass one fixed parameter (e.g the count of other items) and any number following. In such a case the function declaration needs to be something like:
int myfunc(int p1, ...)
{
}
int rc = myfunc(1, foo);
int rc = myfunc(3, foo, 10, "some text");
which is how printf and its variants do it.