Ich habe einen Wrapper um printf Funktion:Zahl der Argumente von vprintf verwendet
enum Color {
Black, White
};
void my_printf(char *fmt, ...)
{
char big_buffer[1024];
/* do some stuff */
va_list myargs;
va_start(myargs, fmt);
int ret = vsprintf(big_buffer, fmt, myargs);
/* process arguments that were not processed by vprintf */
va_end(myargs);
}
/* example of usage */
my_printf("%d %ld %y %y\n", 3, 3L, Black, White); /* %y - knows how to printf colors */
fmt kann meinen benutzerdefinierten Bezeich enthält Standard printf Planer und. In fmt Zeichenfolge benutzerdefinierte Bezeichner befinden sich immer nach Standard-Bezeichner. Um Standardspezifizierer zu verarbeiten, benutze ich vprintf und dann verarbeite ich Argumente, die nicht von vprintf verarbeitet wurden. Im Moment zu tun, dass ich fmt Zeichenfolge manuell zu analysieren haben und tun mehrere va_arg abhängig von Planern in fmt aber es ist fehleranfällig. Ist es möglich, eine Funktion zu verwenden, die mehrere va_arg für mich tun?
Ich versuchte myargs nach vprintf zu verwenden. Es scheint zu funktionieren. Aber wie ich es verstehe, ist es illegal, va_list Objekte zu verwenden, nachdem sie an andere Funktionen übergeben wurden, die va_arg verwenden können.
Hinweis: Ich weiß, dass in diesem besonderen Fall, dass ich Farbe bespannen vor dem Aufruf my_printf und % s Spezifizierer in fmt statt % y umwandeln kann verwenden. Es ist nur ein vereinfachtes Beispiel. Also die Idee ist, dass ich meine benutzerdefinierten Bezeichner habe und ich sie innerhalb my_printf verarbeiten muss. Es müssen also keine Antworten vorgeschlagen werden, die keine benutzerdefinierten Spezifizierer verwenden sollten.
Bitte veröffentlichen Sie das [Minimale, vollständige und überprüfbare Beispiel] (http://stackoverflow.com/help/mcve), das das Problem zeigt. Zeigen Sie, wie Sie 'my_printf' aufrufen, was es ausgibt und was Sie verarbeiten wollen, das' vprintf' nicht tut. –
Anstatt den MCVE zu posten, hast du die Frage verschoben. –
warum du zweimal 'va_end (myargs);'? – Stargateur