Я понимаю, что разница между функциями printf, fprintf, sprintf и функциями vprintf, vfprintf, vsprintf и т.д. связана с тем, как они относятся к аргументам функции. Но как конкретно? Есть ли какая-то причина использовать один над другим? Должен ли я всегда использовать printf, поскольку это более распространенная вещь, чтобы видеть на C, или есть ли законная причина выбрать vprintf вместо этого?
Какая разница между семействами функций printf и vprintf, и когда я должен использовать один над другим?
Ответ 1
printf() и друзья для нормального использования. vprintf() и друзья, когда вы хотите написать свою собственную функцию printf(). Предположим, вы хотите написать функцию для печати ошибок:
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
// what here?
va_end(args);
return result;
}
Вы заметите, что вы не можете передать args в printf(), так как printf() принимает много аргументов, а не один аргумент va_list. Однако функции vprintf() принимают вместо аргумента va_list аргумент va_list, так что это завершенная версия:
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
fputs("Error: ", stderr);
result = vfprintf(stderr, fmt, args);
va_end(args);
return result;
}
Ответ 2
Вы никогда не хотите использовать vprintf() напрямую, но это невероятно удобно, когда вам нужно, например, wrap printf(). В этих случаях вы определяете функцию верхнего уровня с переменными аргументами (...). Затем вы соберете их в va_list, выполните свою обработку и, наконец, вызовите vprintf() в va_list, чтобы получить распечатку.