Подтвердить что ты не робот

Какая разница между семействами функций printf и vprintf, и когда я должен использовать один над другим?

Я понимаю, что разница между функциями printf, fprintf, sprintf и функциями vprintf, vfprintf, vsprintf и т.д. связана с тем, как они относятся к аргументам функции. Но как конкретно? Есть ли какая-то причина использовать один над другим? Должен ли я всегда использовать printf, поскольку это более распространенная вещь, чтобы видеть на C, или есть ли законная причина выбрать vprintf вместо этого?

4b9b3361

Ответ 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, чтобы получить распечатку.