va_start,va_end, va_arg

  在我们编程的过程中,有时可能会需要一个参数个数不确定的函数。比如说我们想求不确定个数字的和:int sum(...),但是我们怎么来确定函数里面的参数呢,怎么取得几个数字相加呢,要定位参数的位置,va_start,va_end,va_arg就派上用场了。这几个宏的原型及涉及宏的原型:

#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end
#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap)      ( ap = (va_list)0 )
#define _ADDRESSOF(v)   ( &reinterpret_cast<const char &>(v) )
第一个宏也就是找到第二个参数的位置,现在把函数写具体一点:

int add_ser(int num, ...)
{
	int nSum = 0;
	va_list arg;
	va_start(arg, num);
	cout << *(int*)arg << endl;
	for(int i=0; i<num; ++i){
		printf("%p ", arg);
		nSum += va_arg(arg,int);
		cout << endl;
	}
	va_end(arg);
	cout << nSum <<endl;

	return nSum;
}
现在arg指向第二个参数,如果参数列表是这个add_ser(4,1,2,3,4);那么arg现在指向1;

第二个宏是意思是使arg指向下一个数,返回当前的数,通过打印arg便可知。注意:(ap += _INTSIZEOF(t)) - _INTSIZEOF(t)这句意思是ap指向下一个数了,但是返回的是当前数,下一次则返回下一个数,而ap指向下下个数。当va_start(arg,num)完成的时候arg指向1,第一次循环va_arg(arg,int)之后arg已经指向2了,但是va_arg(arg,int)返回的是1。当循环完成后arg指向最后一个数的下一个数

第三个宏将ap置零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值