头文件:#include <stdarg.h>
// 头文件支持需要自己添加 这里只是说明基本的使用方法
基本使用方法
double average(int num ...){
va_list valist;
double sum = 0;
va_start(valist,num);
for(int i=0;i<num;++i)
sum+=va_arg(valist,int);
va_end(va_list)
return sum/num;
}
头文件中的源码
typedef char* va_list;
#define va_start(ap,A) (void)(ap)=(char*)&(A)+
_Bnd(A,AUPNUD))
#define va_arg(ap,T) (*(T)(ap)+=Bnd(T,_AUPBND))-
_Bnd(T,AUPNUD))
#define va_end(ap) (void)0
int print(char *format,...)
宏va_list的第一个参数是va_list类型的变量,第二个参数是省略号前最后一个有
名字的参数, 功能是初始化va_list类型的变量,将其值设置为可变参数的第一个变
量 宏va_arg的第一个参数是va_list类型的变量, 第二个参数是参数列表的下一个
参数的类型。 va_arg返回va_list变量的值,并使该变量指向下一个可变参数
va_end是在va_arg访问完最后一个可变参数之后调用的
#define _AUPBND(sizeof(acpi_native_int)-1)
#define _ANDBND(sizeof(acpi_native_int)-1)
#define _bnd(X,bnd)(((sizeof(X))+(bnd))&(~(bnd)))
typedef s32 acpi_native_int
typedef s64 acpi_native_int
s32表示这种宏定义,表明int类型是用32位表示,表示当前内存4字节对齐 S64表示
int类型是用64位表示,表示当前内存是8字节对齐
除此之外还可以用另一种实现
void debug_arg(unsigned int num, ...){
uint i=0;
uint *addr =#
for(int i=0;i<num;++i){
printf("i=%d,value = %d\n",i,*(addr+i));
}
}
//通过对参数列表的指针偏移达到值的读取