最近在看<the c programming language> K&R
7.3章 Variable-length Argument Lists 变长参数列表, 笔记一下用法
1. 要用到的头文件 <stdarg.h>
包含一些用来遍历(step through)变长参数列表的 宏(marco)定义
2. 类型 va_list : refer to each argument in turn (va 是 variadic arguments的缩写)
va_list ap; /* 声明va_list 类型的指针 ap */
3. 宏va_start
用法: va_start(va_list , char *);
初始化 va_list 类型的指针, 指向列表中第一个未命名的参数, 一定要先调用它
va_start 要用到最后一个命名的参数,所以函数参数列表中至少要有一个命名参数
4.va_arg
用法: va_arg(va_list , type name); /* type name 可能是 int double 这些类型 */
返回一个参数, 将指针指向下一个参数
5.va_end
用法: va_end(va_list);
对va_start 的善后工作
6.va_cpy
用法: va_copy(va_list src, va_list dest);
示例代码: (摘自: man page)
对va_list va_start va_arg va_end 的简单顺序调用
/* The function foo takes a string of format characters and prints out the argument associated
* with each format character based on the type.
*/
#include <stdio.h>
#include <stdarg.h> void
foo(char *fmt, ...)
{
va_list ap;
int d;
char c, *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);
}
附: Linux下可以用man 命令查看 stdarg, va_start, va_arg, va_end, va_copy
man 3 stdarg