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;
}
阅读 1.9k
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 的值是未定义。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题