全,
我正在编写一个小型的c++应用程序,并且被这个问题所困扰。如果不希望使用va_list宏从va_arg宏访问元素,是否有方法创建(并在以后捕获)错误。例:-
count=va_arg(argp,int);
if (count <= 0 || count > 30)
{
reportParamError(); return;
}现在,如果我传递的是ty胡枝子,而不是int,我在MS编译器上得到了垃圾值,但是95%的时间计数在gcc上(在64位sles10系统上)得到0。是否有一种方法可以强制进行一些类型转换,从而得到一个可以在catch块中捕获的错误?
任何关于这方面的想法都会对我很有帮助。或者有更好的方法来做这个。功能原型是:-
void process(App_Context * pActx, ...) 函数被调用为
process(pAtctx,3,type1,type2,type3);必须将pActx作为第一个参数传递,因此不能将计数作为第一个参数传递。
更新-1
好吧,这听起来很奇怪,但纳格斯似乎不属于va_list sles10 gcc的一部分。我不得不把
#ifdef _WIN32
tempCount=va_arg(argp,int)
#endif使用此方法后,nargs后面的参数不会获得垃圾值。然而,这引入了基于编译器/平台的#ifdefs....Thanks Chris和Kristopher。
发布于 2010-12-29 20:34:01
如果知道计数将始终作为第二个参数传递,则可以将签名更改为:
void process(App_Context * pActx, int count, ...) 如果这不是一种选择,那就没有办法抓住它。这就是变量参数列表的工作原理:除了调用者传递的任何信息之外,被调用方无法知道传递的是哪些参数。
如果您查看va_arg宏和相关宏是如何实现的,您可能会知道如何检查堆栈中的所有内容。但是,这是不可移植的,除了作为调试辅助工具之外,不建议使用它。
您还可能希望研究变量参数的替代方案,如函数重载、模板或传递参数的vector或list。
发布于 2010-12-29 20:33:17
不,不可能。varargs没有提供任何方法来检查传入的参数类型。您只能使用正确的类型读取它们,这意味着您需要另一种方式来传递类型信息。
除非您真的需要,否则最好避免varargs功能。它实际上只是一个C++特性,是为了printf和朋友等遗留函数而开发的。
https://stackoverflow.com/questions/4557582
复制相似问题