2017-12-30 81 views
-2

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.

+0

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

+0

Anstatt den MCVE zu posten, hast du die Frage verschoben. –

+1

warum du zweimal 'va_end (myargs);'? – Stargateur

Antwort

2

Ist es möglich, eine Funktion zu verwenden, die mehrere va_arg für mich geeignet ist?

Nein, es gibt keine Standardfunktion, die mehrere geeignete va_arg tun. Wenn vsprintf(big_buffer, fmt, myargs); ungültige Druckspezifizierer erkennt, ist das Ergebnis undefiniertes Verhalten. (UB).

Im Moment zu tun, dass ich fmt Zeichenfolge manuell zu analysieren habe und tue mehr va_arg abhängig von Planern in fmt aber es ist fehleranfällig

Dies ist, was Sie zu tun haben.


Betrachten Sie eine Frage mit Code veröffentlichen, die Sie fmt Zeichenfolge manuell analysieren verwendet, und wir könnten helfen, es anfällig weniger Fehler zu machen.


Alternative: Code einen anderen print(...) Ansatz berufen könnten, negiert die Notwendigkeit explizit codiert Typdeklarierer.Example

+0

Danke für den Link. Ich werde es mir ansehen. –

2

Haben Sie darüber nachgedacht, die GNU implementation of printf herunterzuladen und zu verwenden? Es enthält einen (relativ) einfachen Weg zu customize printf, wie Sie uns in Ihrem Beispiel gezeigt haben.

+0

Ich werde darüber nachdenken. Vielen Dank. –

+0

Super aussehende Einrichtung. Ich hätte wissen müssen, dass GNU printf so etwas hätte. Danke für den Tipp; Gut zu wissen. –

Verwandte Themen