C++ c++;va_arg类型转换问题

C++ c++;va_arg类型转换问题,c++,variadic-functions,C++,Variadic Functions,全部, 我写了一个小型C++应用程序,并被这个问题难住了。如果不需要元素类型,是否有方法在使用va_arg从va_list宏访问元素时创建(并稍后捕获)错误。例如:- count=va_arg(argp,int); if (count <= 0 || count > 30) { reportParamError(); return; } 该函数称为 process(pAtctx,3,type1,type2,type3); pActx必须作为第一个参数传递

全部,

我写了一个小型C++应用程序,并被这个问题难住了。如果不需要元素类型,是否有方法在使用va_arg从va_list宏访问元素时创建(并稍后捕获)错误。例如:-

count=va_arg(argp,int); 
if (count <= 0 || count > 30)
{   
      reportParamError();   return;
}
该函数称为

 process(pAtctx,3,type1,type2,type3);
pActx必须作为第一个参数传递,因此不能将计数作为第一个参数传递


更新-1

好吧,这听起来很奇怪,但nargs似乎不在sles10 gcc的va_列表中。我得把钱投进去

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

使用此选项后,NARG后面的参数不会获取垃圾值。但是,这引入了基于编译器/平台的IFDEF…谢谢Chris和Kristopher

不,没有办法。varargs不提供任何方法来检查传入的参数类型。您只能使用正确的类型阅读它们,这意味着您需要另一种传达类型信息的方式


除非您真的需要,否则最好避免使用varargs功能。它只是一个真正的C++特性,用于遗留函数,如<代码> Prtff < /C>和朋友> < /P> < P>如果你知道一个计数总是作为第二个参数传递,那么你可以将签名更改为:

void process(App_Context * pActx, int count, ...) 
如果这不是一个选项,那么就真的没有办法抓住它。这就是变量参数列表的工作原理:除了调用方传递的任何信息之外,被调用方无法知道传递的是什么参数

如果您研究一下
va_arg
宏和相关宏是如何实现的,您可能会发现如何检查堆栈上的所有内容。但是,这是不可移植的,除了作为调试辅助外,不建议使用它


您可能还想研究变量参数的替代方法,如函数重载、模板或传递
向量
列表

为什么不将计数作为第二个参数<代码>无效流程(应用程序上下文*pActx,标准::大小名称,…)@Chris,谢谢你的建议。我使用了这个选项,但是使用gcc,nargs之后的第一个参数(type1)是垃圾值。最后一个参数还获取垃圾值。我假设NARG也是va_列表的一部分,在va_开始(argp,App_Context*)之后是va_arg(argp,int)。非常感谢您的建议。我试过你提到的方法。我面临着这种方法的问题。count之后的第一个参数始终在64位sles10系统上获取垃圾值。va_列表来自一个.c文件。经过一些基本检查后,va_列表被传递到一个.cpp文件。这就是垃圾问题出现的原因。在.c函数中,我执行了va_启动(argp,App_Context*)。count=va_arg(argp,int)。然后我调用进程(pActx、count、argp)。在它里面有一个参数(参数,类型1)。因为type1总是得到垃圾值,所以我不得不改变方法。+1这里的根本问题是
main
是标准定义的类型不安全的。
void process(App_Context * pActx, int count, ...)