Способ, который вы показали, недопустим, если все именованные аргументы не совместимы с enum
(это можно исправить с помощью аргумента void *
).
Однако вы можете сделать что-топохож на varargs, который выглядит аккуратнее:
#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);
/* ... */
}
Вы бы использовали его так:
named_arg_initializers(&p, AGE, 110, NAME, "Claude Choules", NA_SENTINEL);