C++可变参数处理过程中遇到的疑难杂症-创新互联

今天在处理可变参数函数赋值过程中发现了一个比较头疼的问题,

void FuncTest(  LONG lMBId, int nMBType, char* pStrMsg, ...)

注意 char * pStrMsg 最后一个参数是可变参数, 可变参数要求必须在是最后一个参数 这都么马达。

为兴宁等地区用户提供了全套网页设计制作服务,及兴宁网站建设行业解决方案。主营业务为网站设计制作、成都网站制作、兴宁网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

但是下面的处理过程, 却没有达到预期的效果

pStrMsg 输入的是 价格 %s 总价 %s , 然后参数通过可变参数传递了两个 字符串, 而且这两个字符串是同一个函数

地址栈返回的

va_list argList;
	va_start(argList, pStrMsg);
	vsprintf(msg, pStrMsg, argList);
	va_end(argList);

上面的处理过程没问题 , 将可变参数的值拷贝到格式化字符串中,理想状态应该输出 价格 10000 总价 5000

但是 最后输出的字符串 成 价格 10000 总价 10000 , 也就是说 第二个可变参数的值没有取出来。

检查了N遍代码, 始终找不到问题在哪里,调用堆栈 单步调试也跑了,最后发现 vsprintf(msg, pStrMsg, argList);

这里获取可变参数的时候,栈指针指向的是同一个地址,自然返回值肯定是一样的,问题就在这里。

调用的时候 FuncTest( LONG lMBId, int nMBType, char* pStrMsg, GetPrice(a),GetPrice(b))

这里的GetPrice() 在同一个可变参数的函数中调用了两次 ,自然取到的栈地址一样,导致值相同。

解决方案:重新扩展 GetPriceEx (b)然后通过以下方式调用

调用的时候 FuncTest( LONG lMBId, int nMBType, char* pStrMsg, GetPrice(a),GetPriceEx(b))

传递不同的栈指针, 就可以取到可变参数的准确值。 希望大佬们别在这里耽误了时间。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:C++可变参数处理过程中遇到的疑难杂症-创新互联
标题URL:http://pwwzsj.com/article/cogchi.html