设为首页 加入收藏

TOP

C++ 可变参数的函数(二)
2013-10-17 09:11:59 来源: 作者: 【 】 浏览:399
Tags:  可变 参数 函数

 

  4 va_end(ap);

  这个宏用来宣告可变参数调用的结束,要用在最后面。

  再来看宏的解释:

  1  typedef char *  va_list;

  说明va_list 是一个char*类型的。

  2 #define va_start  _crt_va_start

  #define_crt_va_start(ap,v)  ( ap =(va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

  #define _ADDRESSOF(v)   ( &reinterpret_cast<constchar&>(v) )

  #define _INTSIZEOF(n)   ( (sizeof(n)+sizeof(int) -1) & ~(sizeof(int)- 1) )

  这个是为了内存对齐。什么叫做内存对齐呢?我们知道任何正整数都可以表达为

  x = n*q + r , ( 0≤r<q ),

  对齐就是要当r = 0 时,x = n*q。当 r>0 时候,x = ( n + 1 )*q

  所以对于最终要求的结果 x ,我们可以得出这样的表达式:

  x = n*q + r ,  ( -q<r≤0 )

  方程的两边都加上 q-1 得:

  x + q - 1 = n*q + (r + q - 1), ( 0≤r + q - 1<q )

  其中的n*q 就是我们最终要求的结果,那么n*q的结果就可以表示为:

  (x + q - 1)/q*q = n*q.

  如果 q是2进制的整数次幂,事情就更加好办了. 假设 q = 2^k,那么只需要把(x + q - 1)的0-m-1次位清零即可。即:

  (x + q -1 )&~(q-1).

  从以上可以得出va_list 是为了得出可变参数中第一个元素的地址,从这里也可以看出,参数v必须是命名参数中的最后一个参数。

  3 #define va_arg _crt_va_arg

  #define_crt_va_arg(ap,t)    ( *(t *)((ap +=_INTSIZEOF(t)) - _INTSIZEOF(t)) )

  (ap +=_INTSIZEOF(t))   //实现ap的值偏移

  (ap +=_INTSIZEOF(t)) - _INTSIZEOF(t))   //实现把地址定位到参数的指向地址

  (t *)((ap +=_INTSIZEOF(t)) - _INTSIZEOF(t))              //强制类型转换成参数的类型

  ( *(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //取出参数的值

  4  #defineva_end _crt_va_end

  #define_crt_va_end(ap)      ( ap = (va_list)0 )

  最后这个简单了,就是清理门户,让ap不再指向栈中内存。

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.4.3 Visual C++ 6.0的上机过程.. 下一篇C语言/C++中怎样产生随机数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: