我破解了一些旧的C API,得到了一个编译错误,代码如下:
void OP_Exec( OP* op , ... )
{
int i;
va_list vl;
va_start(vl,op);
for( i = 0; i < op->param_count; ++i )
{
switch( op->param_type[i] )
{
case OP_PCHAR:
op->param_buffer[i] = va_arg(vl,char*); // ok it works
break;
case OP_INT:
op->param_buffer[i] = &va_arg(vl,int); // error here
break;
// ... more here
}
}
op->pexec(op);
va_end(vl);
}
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
的错误是:
main.c|55|error: lvalue required as unary ‘&’ operand
那么,为什么这里不可能有一个指向论点的指针呢?
怎么解决这段代码经常用不同的
OP*
执行,所以我不想分配额外的内存。是否可以在只知道参数大小的va_列表上迭代?
最佳答案
由于无法修改pexec()
函数,因此litb's answer对您不可用,如果编译器提供了alloca()
函数,则可以使用alloca()
修复此问题:
switch( op->param_type[i] )
{
int *itmp;
case OP_PCHAR:
op->param_buffer[i] = va_arg(vl,char*); // ok it works
break;
case OP_INT:
itmp = alloca(sizeof(int));
*itmp = va_arg(vl, int);
op->param_buffer[i] = itmp;
break;
// ... more here
}
通常是盲目快速的,因为它通常使用与为局部变量分配空间相同的机制来实现。当调用函数退出时,空间将自动释放。
关于c - 如何获得va_arg的地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2670850/