va_list и va_arg

Я использую va_list, как это:

void foo(const char* firstArg, ...) {
    va_list args;
    va_start (args, firstArg);
    for (const char* arg = firstArg; arg != NULL; arg = va_arg(arg, const char*)) {
         // do something with arg
    }

    va_end(args);
}

foo ("123", "234", "345")

первые три аргумента были переданы в foo правильно, но где "345" сделано,

 arg = va_arg(arg, const char*) 

установите какое-то другое странное значение на arg.

так в чем проблема. Я использовал llvm3.0 в качестве моего компилятора.

2 ответа

С не ставит автоматически NULL в конце ... список аргументов. Если вы хотите использовать NULL чтобы определить конец аргументов, вы должны передать его явно. Некоторые функции (такие как printf) использовать более ранние параметры, чтобы решить, когда они достигнут конца аргументов.

(Изменить: И на самом деле, если вы хотите поставить NULL в конце вам нужно привести его к соответствующему типу, чтобы он передавался как правильный тип нулевого указателя.)

Я думаю, что цикл должен быть следующим:

for (const char* arg = firstArg; arg != NULL; arg = va_arg(args, const char*))

Изменение va_arg(args, const char*) вместо va_arg(arg/*<<==*/, const char*),

Другие вопросы по тегам