va_list и va_arg - PullRequest
       10

va_list и va_arg

4 голосов
/ 30 марта 2012

Я использовал 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 ]

11 голосов
/ 30 марта 2012

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

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

4 голосов
/ 30 марта 2012

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

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

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

...