在<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
int
va_sum (
int
first_num, ...) /*修改成
int
va_sum (
int
first_num,
int second
_num, ...)同样正确。*/
{
// (1) 定义参数列表
va_list
ap;
// (2) 初始化参数列表
va_start
(ap, first_num);
int
result = first_num;
int
temp = 0;
// 获取参数值
while
((temp =
va_arg
(ap,
int
)) != END)
{
result += temp;
}
// 关闭参数列表
va_end
(ap);
return
result;
}
int
main ()
{
int
sum_val = va_sum(1, 2, 3, 4, 5, END);
printf
(
"%d"
, sum_val);
return
0;
}