C语言 ---可变参数

头文件:#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 =&num;
	for(int i=0;i<num;++i){
		printf("i=%d,value = %d\n",i,*(addr+i));
	}
}
//通过对参数列表的指针偏移达到值的读取
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值