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*)
,