MY_LOG_MESSAGE
wird vom Präprozessor als ein Argument behandelt, da es eine Präprozessordirektive ist. LEVEL1,"This is my log"
ist in Ihrem MY_LOG_MESSAGE
enthalten und wird als ein einziges Präprozessor-Argument behandelt, wenn es in anderen Präprozessor-Direktiven verwendet wird.
Für einfache Funktionen wie
void DoLogging(Level level, const std::string& msg)
Ihr Makro, wie Sie es erwarten, wird Aufruf behandelt. Also DoLogging(MY_LOG_MESSAGE)
wird funktionieren. Es wird hier erweitert, weil es not
als Argument einer anderen Präprozessor-Direktive verwendet wird, aber innerhalb einer real
Funktion. Was könnte helfen, ist so etwas wie dieses:
#define MY_LOG_MESSAGE LOG(LEVEL1, "My message")
Furhtermore, wenn es mehrere LOG() - Makros, wie Sie wies darauf hin, es ist nur als Parameter verwenden, von Ihnen MY_LOG_MESSAGE, wie folgt aus:
#define MY_LOG_MESSAGE(logger) logger(LEVEL1, "My message")
In Ihrem Code rufen Sie einfach MY_LOG_MESSAGE(LOG)
Was bedeutet 'log' erweitern können? – trojanfoe
@trojanfoe Es fehlschlägt Vorverarbeitung – dimba
Wenn dies tatsächlich über Protokollierung und nicht nur ein Beispiel ist, würde ich ernsthaft vorschlagen, eine ordnungsgemäße Protokollierungsbibliothek, z. [Boost.Log] (http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/index.html), anstatt selbst zu rollen. Vor allem, wenn es auf dem Präprozessor basiert. –