__func__ in logger nutzen
-
Hallo zusammen,
ich habe ne bissl komische Frage und hoffe, dass ihr mich versteht.
Ich habe mir einen kleinen Logger gebastelt, nach dem Vorbild von log4cpp. Funktioniert auch alles fein, gar keine Probleme. Nun habe ich gelesen, dass es ja die Macros __LINE__ und __func__ bzw. BOOST_CURRENT_FUNCTION gibt. Mein logger funktioniert aktuell so vom Aufruf:log << DEBUG << "message to log";Dabei ist DEBUG ein enum, welches vom Logger als LogLevel verwendet wird und im Output in den entsprechenden String umgewandelt wird. Nun meine Frage, kann man irgendwie in diese Kette die Makros versteckt einbauen, ohne dass der Nutzer explizit jedesmal __LINE__ schreiben muß? Ich habe keine Idee, wie man das Präpozessor-Ergebnis an die Funktion übergeben könnte. Vermutlich ist es wieder ganz einfach. Die einzige Idee, welche mir vorschwebt wäre den Output-operator irgendwie zu überladen/erweitern, dass er per default __LINE__ und __func__ mitbekommt. Aber geht das?
Schon mal dank!
-
#define LOG(logger) logger << __func__ << "Hi" << ...Man muss Makros verwenden, da __func__ und Co sich sonst auf die aufgerufene Funktion beziehen.
-
__func__ist kein Makro. Sondern eine sog. function-local predefined variable.The function-local predefined variable
__func__is defined as if a definition of the formstatic const char __func__[] = "function-name ";__func__wird also nie durch etwas ersetzt sondern ist einfach der Name einer Variable.Und solange du __LINE__ auch entsprechend verwendest (ohne dass es vorzeitig ersetzt wird) kannst du folgendes schreiben:
#define INFO (std::to_string(__LINE__) + ' ' + __func__) // [..] std::cout << INFO;
-
hallo zusammen,
ja, solche makros hatte ich früher. da ich hier nen simulator verwende, welcher an verschiedene dienste logged, war dies immer sehr unschön (in jeder klasse musste man das macro neudefinieren, damit die ausgaben stimmen ...). daher kam der wunsch, es los zu werden. falls ihr versteht. ich habe überlegt, ob es möglich ist, den operator<< so zu überladen, dass automatisch immer __LINE__ als parameter verwendet wird. aus:
operator<<(ostream & s, LoggerLevel level);
irgendwas wie:
operator<<(ostream &s, LoggerLevel level, string line=__LINE__);
ohne dass es mit dem nachfolgenden strings kollidiert.
-
sven_ schrieb:
ich habe überlegt, ob es möglich ist, den operator<< so zu überladen, dass automatisch immer __LINE__ als parameter verwendet wird. aus:
operator<<(ostream & s, LoggerLevel level);
irgendwas wie:
operator<<(ostream &s, LoggerLevel level, string line=__LINE__);
ohne dass es mit dem nachfolgenden strings kollidiert.Vielleicht sowas
#define log2 log<<debug<<' '<<__func__<<' '<<line<<':' … log2<<"something happened";aber es wird bei Makros bleiben.
-
@volkard: Wenn überhaupt dann in Klammern. Man könnte auch eine Funktion
std::ostream& printInfo(std::ostream& os, unsigned line, char const* func) { return os << '\n' << line << ' ' << func << ": "; } #define INFO_LOG (printInfo(log, __LINE__, __func__)) INFO_LOG << "Hi!";schreiben.
-
Arcoth schrieb:
Man könnte auch eine Funktion schreiben.
Mehrwert?
-
Swordfish schrieb:
Arcoth schrieb:
Man könnte auch eine Funktion schreiben.
Mehrwert?
Mehr Klammern.
@Arcoth: Ich hätte
#define INFO_LOG ((((printInfo(((log)), ((__LINE__)), ((__func__)))))))geschrieben.
-
hallo zusammen,
nun schade, dass es nur über macros geht. aber da bleibe ich lieber bei meiner lösung.

vielen dank für die tips. trotzdem viel gelernt.

-
sven_ schrieb:
nun schade, dass es nur über macros geht. aber da bleibe ich lieber bei meiner lösung.

Warum?
Makros sind nicht per sé böse, dass hier ist einer der wenigen berechtigten Anwendungsfälle.