1. 变参函数简单示例
#include <stdarg.h>
#include <stdio.h> int Accumlate(int nr, ...)
{
int i = ;
int result = ;
va_list arg = NULL;
va_start(arg, nr); for(i = ; i < nr; i++)
{
result += va_arg(arg, int);
} va_end(arg); return result;
} int main()
{
printf("%d\n", Accumlate(, ));
printf("%d\n", Accumlate(, , ));
printf("%d\n", Accumlate(, , , )); return ;
}
2. 变参函数的实现原理
#define va_list void*
#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))
#define va_arg(arg, type) *((type*)arg); arg = (char*)arg + sizeof(type);
#define va_end(arg) arg = 0;
#include <stdio.h> #define va_list void* #define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start)) #define va_arg(arg, type) *((type*)arg); arg = (char*)arg + sizeof(type); #define va_end(arg) arg = NULL; int Accumlate(int nr, ...)
{
int i = ;
int result = ;
va_list arg = NULL;
va_start(arg, nr); for(i = ; i < nr; i++)
{
result += va_arg(arg, int);
} va_end(arg); return result;
} int main()
{
printf("%d\n", Accumlate(, ));
printf("%d\n", Accumlate(, , ));
printf("%d\n", Accumlate(, , , )); return ;
}
3. 关于参数结束标志的问题
① 指定参数个数,如示例代码
② 用固定值(如-1或NULL)表示最后一个参数
③ 用格式化字符串,如printf函数
注:变参函数至少要提供一个参数