Je pirater une ancienne API C et je suis une erreur de compilation avec le code suivant:Comment obtenir l'adresse de va_arg?
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);
}
L'erreur avec gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
était:
main.c|55|error: lvalue required as unary ‘&’ operand
Alors pourquoi exactement il est impossible ici d'obtenir un pointeur vers l'argument?
Comment le réparer? Ce code est exécuté très souvent avec OP*
différent, donc je préfère ne pas allouer de la mémoire supplémentaire.
Est-il possible d'itérer sur va_list en ne connaissant que la taille des arguments?
va_arg est une macro, vous ne pouvez pas prendre d'adresse de celui-ci. –