繁体   English   中英

C ++ va_arg类型转换问题

[英]c++ va_arg typecast issue

所有,

我正在编写一个小型的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, int count, ...) 

如果这不是一个选择,那么实际上没有办法抓住它。 这就是可变参数列表列表的工作方式:被调用者除了知道调用者传递的任何信息外,没有其他方法知道传递了什么参数。

如果您研究va_arg宏和相关宏的实现方式,则可以找出如何检查堆栈中所有内容的方法。 但是,这不是可移植的,因此不建议将其用作调试辅助工具。

您可能还想研究变量参数的替代方法,例如函数重载,模板或传递vector或参数list

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

除非确实需要,否则最好避免使用varargs功能。 printf和friends之类的遗留功能而言,它实际上只是一个C ++功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM