【发布时间】:2010-12-29 20:28:13
【问题描述】:
全部,
我正在编写一个小型 c++ 应用程序,但被这个问题难住了。如果不期望元素类型,有没有办法在使用 va_arg 从 va_list 宏访问元素时创建(以及稍后捕获)错误。例如:-
count=va_arg(argp,int);
if (count <= 0 || count > 30)
{
reportParamError(); return;
}
现在,如果我传递 typedef 而不是 int,我会在 MS 编译器上得到垃圾值,但 95% 的时间计数在 gcc 上得到值 0(在 64 位 sles10 sys 上)。有没有办法可以强制执行一些类型检查,以便我得到一个可以在 catch 块中捕获的错误?
对此的任何想法都会对我很有帮助。或者有没有更好的方法来做到这一点。函数原型为:-
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, std::size_t nargs, ...); -
@Chris,感谢您的建议。我已经选择了那个选项,但是使用 gcc , nargs 之后的第一个参数(type1)正在获取垃圾值。最后一个参数也获取垃圾值。我假设 nargs 在 va_start(argp,App_Context *) 后跟 va_arg(argp,int) 的意义上也是 va_list 的一部分。