va_list和va_arg

时间:2012-03-30 02:34:12

标签: c variadic-functions

我像这样使用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 个答案:

答案 0 :(得分:10)

C不会自动将NULL放在...参数列表的末尾。如果要使用NULL来检测参数的结尾,则必须明确地传递它。某些函数(例如printf)使用较早的参数来确定它们何时到达参数的末尾。

编辑:实际上,如果你想在最后添加一个NULL,你需要将它强制转换为适当的类型,以便它作为正确的null类型传递指针。)

答案 1 :(得分:4)

我认为循环应该如下:

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

更改为va_arg(args, const char*),而非va_arg(arg/*<<==*/, const char*)