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

G производного класса назовут. Если Вы хотите вызвать функцию в основе, звоните

Base::g();

вместо этого. Если Вы хотите назвать полученный, но все еще хотеть иметь базовую версию названы, расположение, что полученная версия g называет базовую версию в своем первом операторе:

virtual void g() {
    Base::g();
    // some work related to derived
}

то, что функция от основы может назвать виртуальный метод и управление, передается в производный класс, используется в шаблонном шаблоне разработки метода. Для C++ это более известно как Non-Virtual-Interface. Это широко используется также в библиотеке стандарта C++ (потоковые буферы C++, например, имеют функции pub..., которые вызывают виртуальные функции, которые делают реальную работу. Например pubseekoff вызовы защищенный seekoff). Я записал пример этого в этом ответе: , Как Вы проверяете object’s внутреннее состояние?

50
задан Carson Myers 27 September 2009 в 20:14
поделиться

2 ответа

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 вместо переменного числа аргументов, так что вот завершенная версия:

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;
}
71
ответ дан 7 November 2019 в 10:57
поделиться

Вы никогда не захотите использовать vprintf () напрямую, но это невероятно удобно, когда вам нужно, например, обернуть printf () . Для этих случаев вы определите функцию верхнего уровня с переменными аргументами (...). Затем вы соберете их в va_list , выполните свою обработку и, наконец, вызовите vprintf () в va_list , чтобы распечатать распечатку.

15
ответ дан 7 November 2019 в 10:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: