Я взломал старый 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_list, зная только размер аргументов?