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

怎么解?

最新文章

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

热门文章

  1. java LogWriter
  2. 自己写一个 wsgi 服务器运行 Django 、Tornado 等框架应用
  3. spring data jpa 使用JPQL的方式查询
  4. 类的私有private构造函数 ,为什么要这样做
  5. Android毕业四年升P8,年收入超100w,他是如何做到的?
  6. MySQL数据库安装与启动(Linux)
  7. css 两边是线,中间文字的多种实现方法
  8. Samba服务的安装
  9. RemoTing 搭建简单实现
  10. Centos7.2安装MariaDB数据库,并进行基础配置