C++变长参数

如果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++变长参数

上一篇:javascript中的闭包。


下一篇:python 函数和函数式编程