сцепление вызовов функций

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

1
задан YePhIcK 14 April 2019 в 08:50
поделиться

2 ответа

Я чувствую, что упускаю что-то очевидное, но до сих пор не могу понять это

Вы сделали. И это то, с чего вы на самом деле начали: «просто используйте v-версию этих функций» . Причина, по которой эти функции получили v-версию, состояла в том, чтобы позволить, как вы это назвали, соединить их Поэтому, если вы хотите поддержать ее для своей собственной функции, похожей на printf, обязательно следуйте той же практике:

void direct_v(const char * _fmt, bool _extra, va_list args){
    char ca[200];
    vsprintf(ca, _fmt, args);
    std::cout << ca << std::endl;
}

void direct(const char * _fmt, bool _extra...){
    va_list args;
    va_start(args, _extra);
    direct_v(_fmt, _extra, args);
    va_end(args);
}

void chained(const char * _fmt...){
    va_list args;
    va_start(args, _fmt);
    direct_v(_fmt, false, args);
    va_end(args);
}

Хорошее появляющееся свойство разделения direct, подобное тому, что вы получаете лучшее разделение проблемы. Оболочка выполняет связанный бит va_list, а v-функция заботится только о том, что нужно сделать со списком, что позволяет здесь использовать повторно.


Примечание перед редактированием: Кстати, если совместимость с C действительно важна, прототипы функций нуждаются в запятой, чтобы отделить последний аргумент от многоточия. Синтаксис, который вы использовали, - только C ++.

0
ответ дан StoryTeller 14 April 2019 в 08:50
поделиться

Вы не можете связывать вызовы с переменными функциями в стиле C. Единственный способ - передать va_list в качестве аргумента. Именно по этой причине необходимо семейство функций v *.

Таким образом, вы пишете свои v * -подобные функции в терминах va_list, а затем , а затем оборачиваете каждую из них в функцию на основе эллипса.

0
ответ дан n.m. 14 April 2019 в 08:50
поделиться