2009-10-04 8 views
13

filtert Mein Programm schreibt in ein Protokoll und stdout. Jede Nachricht hat jedoch eine bestimmte Priorität und der Benutzer gibt in den Voreinstellungen an, welche Prioritäten in welchen Stream (log oder stdout) gehen.wrapper printf-Funktion, die nach Benutzervorgaben

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0003; 

Die Präferenzen werden von einigen Flags behandelt:

unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); 
unsigned short PRIO_STD = (PRIO_HIGH); 

Die write_log Funktion sollte mit den gleichen Parametern wie die printf-Funktion, mit dem zusätzlichen Parameter von unsigned short priority arbeiten.

write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1); 

(Auch wenn PRIO_NORMAL|PRIO_LOW wenig Sinn macht ...)

die Fahnen Überprüfung ist einfach: if(priority & PRIO_LOG) (Returns 1>, wenn eine Flagge in beiden Argumenten festgelegt ist)

Ich kann aber nicht finden heraus, wie ich gehen würde über die Übergabe der String-Literal und die Format Argumente für die printf-Funktion. Kann mir jemand helfen oder mir einen Zeiger geben (möglich zu einer alternativen Methode, die den gleichen Effekt erzielt)? Es wäre sehr geschätzt.

Antwort

33

Sie wollen vprintf nennen() anstelle von printf() die variablen Argumente „varargs“ Fähigkeiten von C.

int write_log(int priority, const char *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    if(priority & PRIO_LOG) 
      vprintf(format, args); 

    va_end(args); 
} 

Weitere Informationen finden Sie etwas entlang der Linien von this verwenden.

+0

In Visual C++ können Sie stattdessen _____VA_ARGS_____ verwenden. Referenz: http://msdn.microsoft.com/en-us/library/ms177415(v=vs.110).aspx –

+1

Bitte bearbeiten, um anzuzeigen '#include ' – robisrob

5

Ich denke, Jeffs Idee ist der Weg zu gehen, aber Sie können dies auch mit einem Makro ohne Verwendung von vprintf erreichen. Dies könnte gcc erfordern:

#define write_log(priority,format,args...)  \ 
        if (priority & PRIO_LOG) {  \ 
         printf(format, ## args); \ 
        } 

prüfen here für Informationen darüber, wie das funktioniert.

4

Wenn Sie die PRIO_ * Definitionen wollen als Bit verwendet werden (mit | und &), müssen Sie jeder von ihnen seinen eigenen Bit geben:

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0004; 

Das Makro mithilfe der do verbessert werden kann {} while (0) -Notation. Es macht die Aufrufe von write_log mehr wie eine Anweisung.

#define write_log(priority,format,args...) do { \ 
    if (priority & PRIO_LOG) { \ 
     printf(format, ## args); \ 
    } while(0) 
+0

Sorry, Type. Ich habe das natürlich in meiner Quelle gemacht. Danke für das Hinzeigen! +1 für ein scharfes Auge. – wsd