Wrapper printf-Funktion, die nach Benutzereinstellungen filtert

Lesezeit: 2 Minuten

Benutzer-Avatar
wsd

Mein Programm schreibt in ein Protokoll und auf stdout. Jede Nachricht hat jedoch eine bestimmte Priorität und der Benutzer legt in den Einstellungen fest, welche Prioritäten an welchen Stream (Log oder Stdout) gehen.

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

Die Einstellungen werden von einigen Flags gehandhabt:

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

Das write_log Die Funktion sollte mit den gleichen Parametern wie die printf-Funktion arbeiten, mit dem hinzugefügten Parameter of unsigned short priority.

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

(Selbst wenn PRIO_NORMAL|PRIO_LOW macht wenig sinn…)

Das Überprüfen der Flaggen ist einfach: if(priority & PRIO_LOG) (Gibt >1 zurück, wenn ein Flag in beiden Argumenten gesetzt ist)

Ich kann jedoch nicht herausfinden, wie ich das String-Literal übergeben würde und die Formatargumente für die printf-Funktion. Kann mir jemand helfen oder einen Hinweis geben (möglicherweise auf eine alternative Methode, die den gleichen Effekt erzielt)? Es würde sehr geschätzt werden.

Benutzer-Avatar
Der große Jeff

Sie möchten vprintf() anstelle von printf() mit den Variablenargumenten “Varargs„Fähigkeiten von C.

#include <stdarg.h>

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 in etwas in der Art von Dies.

Ich denke, Jeffs Idee ist der richtige Weg, aber Sie können dies auch mit einem Makro erreichen, ohne vprintf zu verwenden. Dies erfordert möglicherweise gcc:

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

Prüfen hier für Informationen darüber, wie dies funktioniert.

Wenn Sie möchten, dass die PRIO_*-Definitionen als Bit verwendet werden (mit | und &), müssen Sie jeder von ihnen ein eigenes Bit zuweisen:

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

Das Makro kann verbessert werden, indem die Notation do { } while (0) verwendet wird. Dadurch wirken die Aufrufe von write_log eher wie eine Anweisung.

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

  • Entschuldigung, Typ. In meiner Quelle habe ich das natürlich so gemacht. danke für den hinweis! +1 für ein scharfes Auge.

    – wsd

    5. Oktober 2009 um 18:09 Uhr

1369740cookie-checkWrapper printf-Funktion, die nach Benutzereinstellungen filtert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy