我正在尝试实现灵活的调试宏/函数库,而命名/可选参数似乎是实现这些函数的最佳方式。
有没有更好的方法在c中执行命名参数,然后是以下内容?
enum named_args {NAME,ADRESS,AGE,NA_SENTINEL};
void named_arg_initializers(struct person p, enum * named_args)
{
enum named_args * current_name;
enum named_args * current_arg;
...
if(named_args==NULL)
return;
current_name = named_args[0];
current_arg = named_args[1];
while(current_name!=NA_SENTINEL)
{
current_name+=2;
current_arg+=2;
if(current_name==NAME)
p.name=current_arg;
else if(...
...
}
...
}
...
}
答案 0 :(得分:17)
不确定
struct toto {
unsigned age;
char name[25];
};
void func(struct toto);
...
func((struct toto){ .name = "you", .age = 18 });
或者如果你想要你可以将它包装在一个宏
中#define FUNC(...) func((struct toto){ __VA_ARGS__ })
...
FUNC(.name = "you", .age = 18 );
答案 1 :(得分:1)
除非命名参数与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);