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 argument
Was 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.