C++ 变量函数va_arg()返回不正确的参数
问题具体解决:请阅读下面的内容 所讨论的变量函数,简化到最简单的是:C++ 变量函数va_arg()返回不正确的参数,c++,function,parameters,variadic,C++,Function,Parameters,Variadic,问题具体解决:请阅读下面的内容 所讨论的变量函数,简化到最简单的是: inline Variant::Variant(int type, int dims, ...) { va_list ap; va_start (ap, dims); //Removed Variant handling code here int i=0; for(;i<dims;i++){ int size = va_arg (ap, int); } //
inline Variant::Variant(int type, int dims, ...)
{
va_list ap;
va_start (ap, dims);
//Removed Variant handling code here
int i=0;
for(;i<dims;i++){
int size = va_arg (ap, int);
}
//Likewise, Removed Variant handling code here
va_end (ap);
}
当我在
int size = va_arg (ap, int);
在函数行中,我得到以下结果:
size holds the value of 800 (correct)
size holds the value of -43587879... (WTF)
size holds the value of 4387643543 (WTF)
然后程序会出现故障,因为这些显然是完全无效的值
有什么想法吗?提前谢谢
问题部分解决:重新启动以某种方式修复了该问题,但现在又出现了一个新问题…
我的另一个变量函数,也就是后来调用的,似乎可以拾取任何参数
传递给Variant()构造函数而不是它自己的构造函数。有什么想法吗
Variant* ArAcc(Variant* in_variable, ...)
{
va_list app;
int index=0;
int i, j;
int mult;
va_start (app, in_variable->arrayaccess->num_dimensions);
for(i=0;i<in_variable->arrayaccess->num_dimensions;i++){
mult = 1;
for(j=i+1;j<in_variable->arrayaccess->num_dimensions;j++){
mult = mult * in_variable->arrayaccess->dim_sizes[j];
}
int size = va_arg (app, int);
mult = mult * size;
index += mult;
}
va_end (app);
return &((*in_variable)[index]);
}
提前感谢。尝试删除内联并使其成为正常功能 编辑:我没有看到评论中已经提到这一点 如果重启解决了问题,这就向我表明问题并没有真正解决,只是碰巧没有引起症状 如果第一个问题确实得到解决,则第二个函数中的以下行可能导致第二个问题:
va_start (app, in_variable->arrayaccess->num_dimensions);
那应该是
va_start (app, in_variable);
当然
根据您的评论,我怀疑当第一种情况不起作用时,您实际上是将一个局部变量作为第二个参数传递给
va_start
,而不是函数参数。您是否尝试添加了u cdecl修饰符?是的,没有任何变化,同样的问题。我使用g++4.6.2(循环中打印大小)进行了尝试当前位置它起作用了。真奇怪。我用VC++2008和minGW在windows上编译,他们都有这个问题。我试着重新开始。声明va_start应该有函数的最后一个已知参数,所以它应该是“va_start(app,in_variable);”而不是“va_start(app,in_variable->arrayaaccess->num_dimensions);”,这很奇怪,因为你说这个版本有效…@64bit_twitchyliquid我不是在评论中给出解决方案的stefaanv。如果他给出答案,你可能会想接受。
va_start (app, in_variable->arrayaccess->num_dimensions);
va_start (app, in_variable);