很多时候我希望函数接收可变数量的参数,例如以 NULL 结尾
#define push(stack_t stack, ...) _push(__VARARG__, NULL);
func _push(stack_t stack, char *s, ...) {
va_list args;
va_start(args, s);
while (s = va_arg(args, char*)) push_single(stack, s);
}
如果 foo 接收到非 char*
变量,我可以指示 gcc 或 clang 发出警告吗?类似于 __attribute__(format)
,但用于相同指针类型的多个参数。
最佳答案
我知道您正在考虑以某种方式使用 __attribute__((sentinel))
,但这是一个转移注意力的问题。
你想要的是做这样的事情:
#define push(s, args...) ({ \
char *_args[] = {args}; \
_push(s,_args,sizeof(_args)/sizeof(char*)); \
})
包装:
void _push(stack_t s, char *args[], int argn);
您可以完全按照您希望的方式编写!
然后你可以调用:
push(stack, "foo", "bar", "baz");
push(stack, "quux");
关于c - 使用 gcc 在 C 中类型安全的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10533842/