博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++变长参数
阅读量:5895 次
发布时间:2019-06-19

本文共 913 字,大约阅读时间需要 3 分钟。

如果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就出现了错误。

 

怎么解?

转载于:https://www.cnblogs.com/long123king/p/3725001.html

你可能感兴趣的文章
【精益生产】车间现场管理的八大浪费
查看>>
关于阿里开发者招聘节 |这5道笔试真题 你会吗!???
查看>>
C#的异常处理机制
查看>>
vsftp:500 OOPS: could not bind listening IPv4 sock
查看>>
Linux安装BTCPayServer并设置比特币BTC和Lightning支付网关
查看>>
Python 的 with 语句
查看>>
mysql安装,远程连接,以及修改密码
查看>>
Mybatis查询返回Map类型数据
查看>>
java的深拷贝与浅拷贝
查看>>
程序员如何提高工作效率
查看>>
promise
查看>>
将Java应用部署到SAP云平台neo环境的两种方式
查看>>
==与equal的区别
查看>>
数据批量导入Oracle数据库
查看>>
调用lumisoft组件发邮件 不需要身份验证 不需要密码
查看>>
DW 正则
查看>>
清理(委托类型实例)事件处理(实例)的函数及Lambda表达式
查看>>
抓屏原理
查看>>
Gridview控件导出Excel之后图片无法显示
查看>>
FastJson
查看>>