找回密码
 立即注册

C++ 可变参数处理过程中遇到的疑难杂症

2024-11-26 17:29| 发布者: admin| 查看: 292| 评论: 0

摘要: 今天在处理可变参数函数赋值过程中发现了一个比较头疼的问题,void FuncTest( LONG lMBId, int nMBType, char* pStrMsg, ...)注意 char * pStrMsg 最后一个参数是可变参数, 可变参数要求必须在是最后一个参数 这都 ...
 今天在处理可变参数函数赋值过程中发现了一个比较头疼的问题,
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)) 传递不同的栈指针, 就可以取到可变参数的准确值。 希望大佬们别在这里耽误了时间。

路过

雷人

握手

鲜花

鸡蛋

QQ|Archiver|手机版|小黑屋|软件开发编程门户 ( 陇ICP备2024013992号-1|甘公网安备62090002000130号 )

GMT+8, 2025-1-18 09:58 , Processed in 0.042616 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部