Я понимаю, что разница между функциями 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
, чтобы получить распечатку.