Этот ответ может помочь вам понять, как писать переменные функции. Обратите внимание, что проверка ошибок / границ не выполняется, не заданы атрибуты, указывающие компилятору, какие аргументы могут подойти, никакого преимущества над простым использованием printf () не достигается.
Это может быть или не быть примером, который вы ищете.
Соответствующий фрагмент (здесь немного расширен):
#include <stdarg.h>
void _printf(FILE *out, va_list ap)
{
vfprintf(out, fmt, ap);
}
void printf(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
_printf(stdout, ap);
va_end(ap);
}
Примечание: для того, чтобы они возвращали правильный тип (целое число со знаком), оставляем читателю упражнение. Для меня это выглядит как домашнее задание, я просто пытаюсь избавить вас от любой проблемы с использованием va_start и va_end, а также показывает, что va_list можно передавать вспомогательным функциям, чтобы избежать дублирования кода во многих реализациях почти то же самое.
Я настоятельно рекомендую посмотреть на реализацию подсистемы BSD (или даже glibc) printf. Вы также можете посмотреть на uclibc, dietlibc и т. Д.