可变长度参数列表

时间:2012-11-23 21:28:11

标签: c

/* va_arg example */
#include <stdio.h>
#include <stdarg.h>

void PrintLines ( char* first, ...)
{
  char* str;
  va_list vl;

  str=first;

  va_start(vl,first);

  do {
    str=va_arg(vl,char*);
    if
    printf ("%s\n",str);

     } while (str!=NULL);

  va_end(vl);
}

int main ()
{
  PrintLines ("First","Second","Third","Fourth",NULL);
  return 0;
}

我们可以像PrintLines一样调用PrintLines("First","Second","Third",6,NULL);函数,将整数作为变量参数列表的一部分。如果有,可以请任何人解释如何做到这一点吗?

2 个答案:

答案 0 :(得分:3)

所以对于你的情况你只需硬编码,如:

void PrintLines ( char* first, ...)
  ...
  str1=va_arg(vl,char*);
  str2=va_arg(vl,char*);
  str3=va_arg(vl,char*);
  int4=va_arg(vl,int);

  va_end(vl);
}

但我认为这不是你想要的:你有时可能想要在pos 4中使用整数调用PrintLines,有时也需要使用字符串。然后你必须告诉它在pos 4的那个东西是什么,因为这个差的函数应该怎么发现112312123是一个整数还是一个字符串的地址? 所以你必须为这个函数提供一些类型信息,可能类似于在printf和friends中完成的:第一个arg包含一个描述其余参数的字符串。也许像vsprintf这样的人会为你做一个完美的工作?

答案 1 :(得分:1)

在C ++ 11中考虑variadic templates。我知道它可以做到这一点,但以前从未使用它。