va_start,va_end, va_arg

来源:互联网 发布:python 爬虫 慢 编辑:程序博客网 时间:2024/05/01 22:23

  在我们编程的过程中,有时可能会需要一个参数个数不确定的函数。比如说我们想求不确定个数字的和: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置零