1、可变参数的函数
<stdarg.h>头文件中定义了一些宏,用于可变参数的函数,如下
va_list:这种类型声明局部状态变量,假设变量名为va(用于下面的描述),用于遍历函数。
va_start:这个宏初始化状态变量va,要先调用之后才能调用va_arg与va_end。
va_arg:这个宏返回参数表中下一个参数的值,将内部指针(在va中)移到下一个参数,下一个参数的类型要用type指定,使va_arg能够计算其在堆栈中的长度,调用va_start之后第一次调用va_arg返回第一个可变参数的值。
va_end:这个函数或宏在用va_arg读取所有参数之后调用,对va进行必要的整理操作。
va_copy:C99中新增,这个宏在dest中复制src的当前状态,在参数表中生成第二个指针,然后可以独立对src与dest采用va_arg,dest中要像src中一样调用va_end。
下面是一个简单的了例子:
#include <stdio.h>
#include <stdarg.h>
void printargs(int num, ...)
{
va_list va;
va_start(va, num);
int index = 0;
int value = num;
while (1) {
printf("args[%d] = %d\n", index, value);
if ((value = va_arg(va, int)) == 0) {
break;
}
index++;
}
va_end(va);
}
int main(void)
{
printargs(1, 2, 3, 4, 5, 0);
return 0;
}
输出结果如下:
args[0] = 1
args[1] = 2
args[2] = 3
args[3] = 4
args[4] = 5
2、可变参数的宏
可变参数的宏,有两种形式,如下例子:
#define MultiArgs(format, ...) printf(format, __VA_ARGS__)
#define PrintArgs(format, args...) printf(format, ##args)
MultiArgs("%s, %s\n", "hello", "world!"); // hello, world!
PrintArgs("%s, %s\n", "hello", "c language!"); // hello, c language!
需要注意的是,上面两种参数宏的参数列表形式的差异,PrintArgs宏的arg参数后面不能有逗号。
原文:http://blog.csdn.net/ieearth/article/details/45216625