c 语言可变参数?

既然 printf 原型是:printf(const char * restrict format, ...);那为什么不能printf(format, va_ptr)这样用呢?

#include <stdio.h>
#include <stdarg.h>

void foo(const char* format, ...) {
  va_list va_ptr;
  va_start(va_ptr, format);
  printf(format, va_ptr); // 为什么不能这样用呢?
  va_end(va_ptr);
}
int main()
{
    foo("%s, %d\n", "test", 100); //输出并不是:test 100

    return 0;
}
阅读 2.1k
2 个回答

接受 va_list 的是 vprintf:

        int vprintf(const char * restrict format, va_list arg);

va_start用于获取函数参数列表中可变参数的首指针(获取函数可变参数列表)
va_end用于结束对可变参数的处理。实际上,va_end被定义为空

如果你直接调用 printf(format, va_ptr);其中的 va_ptr 的值是未定义。

推荐问题