con*_*sed 2 c++ variadic-functions
所有,
我正在编写一个小型的c ++应用程序并且被这个问题困扰了.如果不期望元素类型,有没有办法在使用va_arg从va_list宏访问元素时创建(以及稍后捕获)错误.例如:-
count=va_arg(argp,int);
if (count <= 0 || count > 30)
{
reportParamError(); return;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我传递的是typedef而不是int,我会在MS编译器上获得垃圾值,但95%的时间计数在gcc上获得值0(在64位sles10 sys上).有没有办法可以执行一些类型检查,以便我得到一个可以在catch块中捕获的错误?
任何有关这方面的想法对我都非常有帮助.或者有更好的方法来做到这一点.功能原型是: -
void process(App_Context * pActx, ...)
Run Code Online (Sandbox Code Playgroud)
该函数被称为
process(pAtctx,3,type1,type2,type3);
Run Code Online (Sandbox Code Playgroud)
pActx必须作为第一个参数传递,因此不能将计数作为第一个参数传递.
更新1
好吧,这听起来很奇怪,但是在sles10 gcc上,nargs似乎不属于va_list.我不得不投入
#ifdef _WIN32
tempCount=va_arg(argp,int)
#endif
Run Code Online (Sandbox Code Playgroud)
使用它之后,下面的参数不会得到垃圾值.但是,这引入了基于编译器/平台的#ifdefs ....感谢Chris和Kristopher
如果您知道计数将始终作为第二个参数传递,那么您可以随时将签名更改为:
void process(App_Context * pActx, int count, ...)
Run Code Online (Sandbox Code Playgroud)
如果那不是一个选择,那么真的没办法抓住它.这就是变量参数列表的工作原理:除了调用者传递的任何信息之外,被调用者无法知道传递了什么参数.
如果你研究如何实现va_arg宏和相关的宏,你可能能够弄清楚如何检查堆栈上的所有东西.但是,这不是便携式的,除了作为调试辅助之外,不推荐使用它.
您还可能希望查看变量参数的替代方法,例如函数重载,模板或传递一个vector或list多个参数.