What you showed is not valid if the named arguments are not compatible with enum (you can fix this with the void * argument).
However, you can do something similar with varargs, which looks more neat:
#include <stdarg.h> enum named_args { NAME, ADDRESS, AGE, NA_SENTINEL }; void named_arg_initializers(struct person *p, ...) { va_list ap; enum named_args argn; va_start(ap, p); for (argn = va_arg(ap, enum named_args); argn != NA_SENTINEL; argn = va_arg(ap, enum named_args)) { switch (argn) { case NAME: p->name = va_arg(ap, char *); break; case AGE: p->age = va_arg(ap, int); break; /* ... */ } } va_end(ap); /* ... */ }
You would use it like this:
named_arg_initializers(&p, AGE, 110, NAME, "Claude Choules", NA_SENTINEL);
source share