在<stdarg.h>中定义了相关处理变长参数的宏va_start,va_arg,va_end。
typedef char * va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) /*整数边界对齐*/
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) /*v是第一个可变参数,为固定的参数。va_start指向第二个可变参数*/
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )/*返回指向的参数,并将指针移向下一可变参数*/
#define va_end(ap) ( ap = (va_list)0 )
举例如下:
#include <stdio.h>
#include <stdarg.h>
#define END -1
intva_sum
(intfirst_num,
...) /*修改成intva_sum
(intfirst_num,int
second_num, ...)同样正确。*/
{
//
(1) 定义参数列表
va_listap;
//
(2) 初始化参数列表
va_start(ap,
first_num);
intresult
= first_num;
inttemp
= 0;
//
获取参数值
while((temp
= va_arg(ap,int))
!= END)
{
result += temp;
}
//
关闭参数列表
va_end(ap);
returnresult;
}
intmain
()
{
intsum_val
= va_sum(1, 2, 3, 4, 5, END);
printf("%d",
sum_val);
return0;
}