va_list和va_arg

hol*_*ety 4 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);
}
Run Code Online (Sandbox Code Playgroud)

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

前三个参数正确传递给foo,但是"345"完成后,

 arg = va_arg(arg, const char*) 
Run Code Online (Sandbox Code Playgroud)

arg设置一些其他的怪胎价值.

所以有什么问题.我使用llvm3.0作为我的编译器.

Ray*_*hen 11

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

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

  • 它计算百分号的数量。 (2认同)
  • 您不需要 va_list 来计算字符串中的百分号。 (2认同)

das*_*ght 4

我认为循环应该如下所示:

for (const char* arg = firstArg; arg != NULL; arg = va_arg(args, const char*))
Run Code Online (Sandbox Code Playgroud)

变化是va_arg(args, const char*)代替va_arg(arg/*<<==*/, const char*).