Devi usare size
invece di fmt
:
va_start(args, size);
È size
, non fmt
, ovvero l'ultimo parametro che ha un nome esplicito (al contrario dei parametri vararg, che non hanno nomi). Devi passare l'ultimo parametro denominato a va_start
in modo che possa capire l'indirizzo in memoria da cui iniziano i parametri vararg.
second parameter of ‘va_start’ not last named argument
Cosa significa e come rimuoverlo?
La tua funzione ha parametri denominati parent
, fmt
e size
. La specifica C dice che devi sempre passare l'ultimo parametro nominato a va_start
, per compatibilità con i compilatori meno recenti. Quindi devi superare size
, non fmt
.
(Ma con un compilatore moderno potrebbe funzionare comunque)
Penso che ci sia confusione qui:la maggior parte delle persone si occupa solo di funzioni simili a prinf che hanno formato e varargs. e pensano di dover passare il nome del parametro che descrive il formato. tuttavia va_start non ha nulla a che fare con nessun tipo di formato simile a printf. questa è solo una funzione che calcola l'offset sullo stack dove iniziano i parametri senza nome.