--- #include struct S { int x; }; static int getX(struct S (*callback)(void)) { return callback().x; } static void applyCallback(struct S s, void (*callback)(struct S)) { callback(s); } static struct S makeS(int x, ...) { return (struct S){ x }; } enum E { ZERO, ONE, TWO }; static enum E makeE(int ordinal, ...) { return ordinal; } struct Args { char a1; char a2; short a3; int a4; long long a5; float a6; double a7; void* a8; unsigned char a9; unsigned short a10; unsigned int a11; unsigned long long a12; enum E a13; struct S a14; void* a15; }; static struct Args getVarargs(int ignore, ...) { va_list args; va_start(args, ignore); struct Args result = { va_arg(args, char), va_arg(args, char), va_arg(args, short), va_arg(args, int), va_arg(args, long long), va_arg(args, double), va_arg(args, double), va_arg(args, void*), va_arg(args, unsigned char), va_arg(args, unsigned short), va_arg(args, unsigned int), va_arg(args, unsigned long long), va_arg(args, enum E), va_arg(args, struct S), va_arg(args, void*) }; va_end(args); return result; } static int sum(int first, int second) { return first + second; }