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 argumentCosa 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.