我像这样使用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作为我的编译器。
答案 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*)
。