C не позволяет функции с переменным аргументом необязательно принимать нулевые параметры.То есть перед ...
.
должен быть именованный параметр. Для printf
именованным параметром является строка формата.При синтаксическом анализе строки формата можно определить тип следующего аргумента и правильно вызвать макрос va_arg
.
Если все аргументы имеют одинаковый тип, вы можете использовать именованный параметр дляукажите количество передаваемых аргументов. Например, если вы передаете несколько строк:
void foo_strings (int n, ...) {
va_list ap;
va_start(ap, n);
while (n--) {
const char *s = va_arg(ap, const char *);
foo(s);
}
va_end(ap);
}
Однако вы могли бы так же легко использовать NULL
, чтобы указать, что больше нетстроки.Затем первый аргумент можно использовать для чего-то другого, например, для указания на функцию.
void foo_string (void (*foo)(const char *), ...) {
va_list ap;
va_start(ap, n);
const char *s = va_arg(ap, const char *);
while (s != NULL) {
foo(s);
s = va_arg(ap, const char *);
}
va_end(ap);
}