一、可变参数函数表示:type fun(int num,...)
其中type表示函数返回值类型,num表示参数个数,而"..."表示所有的参数。
例:char fun(int num,...);
二、va_list,va_start(),va_arg(),va_end()意义及原函数表示。
1、va_list:表示参数列表。
2、va_start():初始化参数列表。
3、va_arg():获取不同类型参数。
4、va_end():清空参数列表。
5、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) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
6、(a+b-1)&~(b-1):在a和b都为2的n次方时,可以求出a和b中最大值的最小倍数。
所以(sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)可用于字节对齐。
#include<stdio.h> #include<stdarg.h> int func(int num,...) // num代表参数个数 { char **arr; int inter[2]; double dou[3]; int i; va_list list; // 参数列表 va_start(list,num); // 初始化参数列表 for(i=0;i<2;i++){ inter[i]=va_arg(list,int); // 获取int类型参数 printf("inter[%d]=%d ",i,inter[i]); } for(i=0;i<3;i++){ dou[i]=va_arg(list,double); // 获取double类型参数 [Warning] 'float' is promoted to 'double' when passed through '...' printf("dou[%d]=%lf ",i,dou[i]); } for(i=0;i<5;i++){ arr[i]=va_arg(list,char*); // 获取char *类型参数 printf("arr[%d]=%s ",i,arr[i]); }
va_end(list); return 0; } int main(){ func(10,1,2,1.0,2.0,3.0,"aaa","bbb","ccc","ddd","eee"); }