gpt4 book ai didi

C++ va_arg 类型转换问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:04:13 26 4
gpt4 key购买 nike

全部,

我正在编写一个小型 C++ 应用程序,但一直被这个问题难倒。如果元素类型不是预期的,是否有一种方法可以在使用 va_arg 从 va_list 宏访问元素时创建(并稍后捕获)错误。例如:-

count=va_arg(argp,int); 
if (count <= 0 || count > 30)
{
reportParamError(); return;
}

现在,如果我传递的是 typedef 而不是 int,我会在 MS 编译器上得到垃圾值,但 95% 的时间计数在 gcc 上(在 64 位 sles10 sys 上)会得到值 0。有没有一种方法可以强制执行一些类型检查,以便我得到一个可以在 catch block 中捕获的错误?

任何关于此的想法都会对我很有帮助。或者有更好的方法来做到这一点。函数原型(prototype)是:-

 void process(App_Context * pActx, ...) 

函数调用为

 process(pAtctx,3,type1,type2,type3);

pActx 必须作为第一个参数传递,因此不能将计数作为第一个参数传递。


更新-1

好吧,这听起来很奇怪,但 nargs 似乎不是 sles10 gcc 上 va_list 的一部分。我不得不投入

#ifdef _WIN32
tempCount=va_arg(argp,int)
#endif

使用这个之后,nargs 后面的参数不会得到垃圾值。但是,这引入了基于编译器/平台的#ifdefs....感谢 Chris 和 Kristopher

最佳答案

如果您知道计数将始终作为第二个参数传递,那么您始终可以将签名更改为:

void process(App_Context * pActx, int count, ...) 

如果那不是一个选项,那么就真的没有办法捕获它。这就是可变参数列表的工作原理:除了调用者传递的任何信息外,被调用者无法知道传递的参数是什么。

如果您查看 va_arg 宏和相关宏的实现方式,您可能会弄清楚如何检查堆栈中的所有内容。但是,这不是可移植的,除非作为调试辅助工具,否则不推荐使用。

您可能还想研究可变参数的替代方案,例如函数重载、模板或传递参数的 vectorlist

关于C++ va_arg 类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com