首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ va_arg类型广播问题

c++ va_arg类型广播问题
EN

Stack Overflow用户
提问于 2010-12-29 20:28:13
回答 2查看 1K关注 0票数 2

全,

我正在编写一个小型的c++应用程序,并且被这个问题所困扰。如果不希望使用va_list宏从va_arg宏访问元素,是否有方法创建(并在以后捕获)错误。例:-

代码语言:javascript
复制
count=va_arg(argp,int); 
if (count <= 0 || count > 30)
{   
      reportParamError();   return;
}

现在,如果我传递的是ty胡枝子,而不是int,我在MS编译器上得到了垃圾值,但是95%的时间计数在gcc上(在64位sles10系统上)得到0。是否有一种方法可以强制进行一些类型转换,从而得到一个可以在catch块中捕获的错误?

任何关于这方面的想法都会对我很有帮助。或者有更好的方法来做这个。功能原型是:-

代码语言:javascript
复制
 void process(App_Context * pActx, ...) 

函数被调用为

代码语言:javascript
复制
 process(pAtctx,3,type1,type2,type3);

必须将pActx作为第一个参数传递,因此不能将计数作为第一个参数传递。

更新-1

好吧,这听起来很奇怪,但纳格斯似乎不属于va_list sles10 gcc的一部分。我不得不把

代码语言:javascript
复制
#ifdef _WIN32
tempCount=va_arg(argp,int)
#endif

使用此方法后,nargs后面的参数不会获得垃圾值。然而,这引入了基于编译器/平台的#ifdefs....Thanks Chris和Kristopher。

EN

回答 2

Stack Overflow用户

发布于 2010-12-29 20:34:01

如果知道计数将始终作为第二个参数传递,则可以将签名更改为:

代码语言:javascript
复制
void process(App_Context * pActx, int count, ...) 

如果这不是一种选择,那就没有办法抓住它。这就是变量参数列表的工作原理:除了调用者传递的任何信息之外,被调用方无法知道传递的是哪些参数。

如果您查看va_arg宏和相关宏是如何实现的,您可能会知道如何检查堆栈中的所有内容。但是,这是不可移植的,除了作为调试辅助工具之外,不建议使用它。

您还可能希望研究变量参数的替代方案,如函数重载、模板或传递参数的vectorlist

票数 5
EN

Stack Overflow用户

发布于 2010-12-29 20:33:17

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

除非您真的需要,否则最好避免varargs功能。它实际上只是一个C++特性,是为了printf和朋友等遗留函数而开发的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4557582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档