makro
-
.filmor schrieb:
Makros ... Parameterlisten variabler Länge, ....
*schubber*
Die Kombination macht mich grausen ....

Gruß,
Simon2.
-
So einiges, da die writeFunktion immer schreiben soll:
Time : type : Message:
sonst müsste ich ja imemr :
Logger::getInstance() << Time << L" "<< type << L" " << Message;
schreiben!
-
#define write Logger::getInstance().write
-
genau, das habe ich gesucht
THX
-
Tc++H schrieb:
genau, das habe ich gesucht
THX
ich hoffe, Du nutzt nirgendwo sonst in Deinem Code (außerhalb vo Kommentaren) das Symbol "write" ..... und wirst das auch nie tun.

Gruß,
Simon2.
-
Simon2 schrieb:
Tc++H schrieb:
genau, das habe ich gesucht
THX
ich hoffe, Du nutzt nirgendwo sonst in Deinem Code (außerhalb vo Kommentaren) das Symbol "write" ..... und wirst das auch nie tun.

Gruß,
Simon2.
insbesondere darf das symbol nicht existieren, wenn Logger::write deklariert bzw. definiert wird

-
camper schrieb:
#define write Logger::getInstance().writeUm die Probleme mit dem Symbol "write" ein wenig zu entschärfen würde ich ein eindeutigeres Symbol wählen, etwa "log_write". Dann ist auch klar, daß ein
write("irgendwas");nicht einfach was schreibt, sondern was mit dem logging zu tun hat.
Aber ein Streaminterface ist sicher besser. Du könntest etwas wie:
#define log_write(expr) \ do { \ Logger l = Logger::getInstance(); \ if (l.isEnabled()) \ l << l.getTime() << ' ' << l.getType << ' ' << expr << std::endl; \ while(false)verwenden. Das hat mehrere Vorteile. Die Formatierung findet nur statt, wenn der Logger aktiviert ist und mit den auszugebenden Typen ist man auch flexibler. Dann kannst Du so etwas schreiben:
log_write("Hello " << 44);Der einfachheit halber kannst Du auch einen std::ostringstream verwenden um die Meldung zu formatieren.
Ich habe so etwas auch mal geschrieben und auch unter der GPL zum download bereit gestellt. Es ist Bestandteil meiner Toolbox, die ich in fast jedem C++-Programm verwende. Wenn Du Interesse hast, melde Dich bei mir (oder suche in deiner bevorzugten Suchmaschine nach Tntnet).
Gruß
Tntnet
-
tntnet schrieb:
#define log_write(expr) \ do { \ Logger l = Logger::getInstance(); \ if (l.isEnabled()) \ l << l.getTime() << ' ' << l.getType << ' ' << expr << std::endl; \ while(false)getInstance klingt nach Singleton, dann wohl eher Logger&.
-
Wenn du Interesse hast kannst du mir ja einmal eine EMail an mail@kevin-jakob.de schreiben. Ich habe auch eine Log-Klasse in ständiger Weiterentwicklung, sie ist auch bei mir Teil meiner Klassenbibliothek. Ich würde mich über einen Gedankenaustausch freuen.
-
Tc++H schrieb:
So einiges, da die writeFunktion immer schreiben soll:
Time : type : Message:
sonst müsste ich ja imemr :
Logger::getInstance() << Time << L" "<< type << L" " << Message;
schreiben!
Naja, ob Du nun "," oder "<<" schreibst, macht den Kohl doch auch nicht fett, oder ? (Dafür sparst Du den Funktionsnamen und zwei Klammern
)
Und die (L" ")s kannst Du ja in den operator<<() einbauen ...Vielleicht das für Dich noch ungewohnter aus als "funcname(arg, arg, arg);" (evtl. weil Du von C oder einer anderen Progsprache her kommst ?), ist mE aber die beste Lösung und kommt ohne Ellipsen und Makros aus- und Du wirst Dich schnell dran gewöhnen und die Vorteile zu schätzen lernen.
Wenn Dich das Logger::getInstance() noch stört, kannst Du das noch durch eine Funktion abkürzen (wobei Abkürzungen immer noch das Problem der Mehrdeutigkeiten haben - aber bei "Funktionsmehrdeutigkeiten" kann der Compiler/Linker wenigstens sicher und einheitlich damit umgehen im Gegensatz zu "Makro-Mehrdeutigkeiten")
Logger& log() { return Logger::getInstance(); }(Außerdem birgt das noch die Gefahr, sich die Referenz "merken" zu wollen (und damit das Singletonpattern einzuschränken) ... aber letztlich kann man das mit getInstance() ebenso machen)
Gruß,
Simon2.