码迷,mamicode.com
首页 > 编程语言 > 详细

C++变长参数

时间:2014-05-14 06:51:14      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:des   style   code   c   tar   ext   

如果C++的变长参数经过了多轮的调用,就可能失去作用

 

间接引址,但是只能引用到第一个变长参数。

va_list marker;
 
va_start(marker, format);
s_loggers[filename]->LoglineF(format, va_arg(marker, va_list));
va_end(marker);

 

或者,没有间接引址,就会造成地址的累积,从而没有引用到真正的参数,而是引用到上一次累积下来的marker地址。

va_list marker;
va_start(marker, format);
s_loggers[filename]->LoglineF(format, marker));
va_end(marker);

 

但是,其实不管怎样,只要让最后一步的marker指向参数列表,就不会出错。

marker是怎样取到的?

 

+        &format    0x01890e68    const char * *
#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 )
typedef char *  va_list;

但是当多了一层函数调用后,format的地址发生了变化

+        &format    0x01890e34    const char * *

因此va_start取到的marker就出现了错误。

 

怎么解?

C++变长参数,布布扣,bubuko.com

C++变长参数

标签:des   style   code   c   tar   ext   

原文地址:http://www.cnblogs.com/long123king/p/3725001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!