定义可变参数的函数,需要在stdarg.h
头文件中定义的va_list
类型和va_start
、va_arg
、va_end
三个宏。
定义可变参数函数
va_list ap; //实际是定义一个指针va_start(ap,num); // 用va_start宏,让ap指向num参数后面的那个参数。
int i = va_arg(ap,int); // va_arg(ap,int) 读取ap指向的变量,ap指向下一个参数。读书的数据类型有va_arg的第二个参数控制
int * p_arg = va_arg(p_va,int*); // 说明读取的参数是整型指针
char * p_arg = va_arg(p_va,char*); // 说明读取的参数是char指针
va_end(ap);//在函数返回前调用
看写的例子: 可变参数求和的两种实现
#include <stdio.h> #include <stdarg.h> int add(int num, ...); int add2(int * arg , ...); int main(){ int temp = add(5,1,2,3,4,5); printf("-->> start result = %d ", temp); printf(" "); int a=1, b=2, c=3, d=4, e=5; temp = add2(&a,&b,&c,&d,&e,NULL); printf("-->> start result = %d ", temp); return 0; } int add(int num, ...){ va_list ap; int result = 0; va_start(ap,num); while(num!=0){ int i = va_arg(ap,int); result += i; printf("-->> i = %d ", i); num--; } va_end(ap); return result; } int add2(int * arg , ...){ va_list p_va; int *p_arg = NULL; int result = *arg; va_start(p_va,arg); p_arg = va_arg(p_va,int*); while(p_arg!=NULL){ result = result + *p_arg; printf("-->> *p_arg = %d ", *p_arg); p_arg = va_arg(p_va,int*); } va_end(p_va); return result; }
end