C++变长参数
2024-09-02 08:51:11
如果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就出现了错误。
怎么解?
最新文章
- LeetCode-66-Plus One
- 基于UDP协议模拟的一个TCP协议传输系统
- js中的replace全局替换
- API23时权限不被许可
- Python进阶09 动态类型
- Visifire Chart控件设置 柱状图 条的宽窄
- Codeforces Round #270 A~D
- JQUERY省、市、县城市联动选择
- CentOS7 citus9.5 集群安装及管理
- 5--OC--构造方法
- Cocos2d-x 多分辨率适配完全解析
- 【机器学习实战】第12章 使用FP-growth算法来高效发现频繁项集
- Html5 移动端 触摸滑动事件
- 常用oracle中系统表查询语句
- Testlink1.9.17使用方法(第五章 测试用例管理)
- 目前我对ReactNative的了解
- C# 生成一个带数字的饼图
- 一个手写的 http client
- python r r+ w w+ rb 文件打开模式的区别
- Vue's Demo