要使用可变参数,需要包含头文件stdarg.h,该头文件声明了一个类型va_list和三个宏va_start、va_arg和va_end,例子如下:
void foo(char *fmt, ...) {
va_list ap;
int d;
char c, *p, *s;
va_start(ap, fmt);
while (*fmt)
switch(*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
}
va_end(ap);
}
1.在定义函数时,最后一个参数为省略号'...',表示传递的参数个数和类型不确定。
void foo(char *fmt, ...) {
va_list ap;
int d;
char c, *p, *s;
va_start(ap, fmt);
while (*fmt)
switch(*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
}
va_end(ap);
}
1.在定义函数时,最后一个参数为省略号'...',表示传递的参数个数和类型不确定。
2.使用va_list声明了一个变量ap,用于访问参数列表中未确定部分,通过调用va_start宏来初始化,让ap变量指向可变参数的第一个参数,该宏有两个参数,第一个参数为va_list类型变量,第二个参数为可变参数的前一个参数,使用可变参数的函数至少包含一个确定参数,因为它必须找到这组可变参数的起始地址,通过什么方式去找呢,只有通过最后一个确定参数的地址来找,下一个参数的地址就是可变参数的地址。
3.va_arg用于返回一个可变参数并将变量ap指向下一个可变参数,va_arg宏也有两个参数,第一个参数为va_list类型变量,第二个参数为参数列表类型。
4.当访问完可变参数后,需要调用va_end宏,完成一些必要的扫尾工作。