Sie müssen size verwenden statt fmt :
va_start(args, size);
Es ist size , nicht fmt , das ist der letzte Parameter, der einen expliziten Namen hat (im Gegensatz zu vararg-Parametern, die keinen Namen haben). Sie müssen den letztgenannten Parameter an va_start übergeben damit es die Adresse im Speicher herausfinden kann, an der die vararg-Parameter beginnen.
second parameter of ‘va_start’ not last named argumentWas bedeutet es und wie wird es entfernt?
Ihre Funktion hat die Parameter parent benannt , fmt und size . Die C-Spezifikation besagt, dass Sie immer den zuletzt genannten Parameter an va_start übergeben müssen , für die Kompatibilität mit älteren Compilern. Sie müssen also size bestehen , nicht fmt .
(Aber mit einem modernen Compiler könnte es trotzdem funktionieren)
Ich denke, hier gibt es eine Verwirrung:Die meisten Leute beschäftigen sich nur mit prinf-ähnlichen Funktionen, die format und varargs haben. und sie denken, dass sie den Parameternamen übergeben müssen, der das Format beschreibt. va_start hat jedoch nichts mit einem printf-ähnlichen Format zu tun. Dies ist nur eine Funktion, die den Offset auf dem Stack berechnet, wo unbenannte Parameter beginnen.