Троеточие в прототипе функции - "место" для оставшихся аргументов.
максрос va_start устанавливает переменную va_list (по сути - указатель) на начало списка оставшихся параметров путйм прибавления к адресу своего второго аргумента его размер - т.е. форматная строка не обязательно перед троеточием, можно
void foo( char *fmt, int a, ...)
{
va_list vl;
va_start( vl, a); // т.е. надо указывать аргумент, идущий
// непосредственно перед эллипсисом
...
}
Ну а функция vsnprintf принимает как аргумент как раз этот va_list