Wrapper printf-Funktion, die nach Benutzereinstellungen filtert
Lesezeit: 2 Minuten
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.
Der große Jeff
Sie möchten vprintf() anstelle von printf() mit den Variablenargumenten “Varargs„Fähigkeiten von C.
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:
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
13697400cookie-checkWrapper printf-Funktion, die nach Benutzereinstellungen filtertyes