Inline? Präprozessor? oder wie?
-
Hallo zusammen,
ich habe in meinem Code einigemale TRACE verwendet, um im Debug ein bischen Ausgabe zu haben. Nun habe ich mir überlegt, dass es für das Release nett wäre, wenn diese Informationen in eine Datei geschrieben werden (so das ich im Release auch eine Ausgabe habe, am besten mit nem Switch).
Wie gehe ich jetzt am besten vor, um nicht jeden TRACE-Aufruf zu bearbeiten? Kann ich TRACE irgendwie überschreiben (oder Suchen/Ersetzen).
Das ganze sollte so aussehen.
Jetzt im Code:
TRACE("Hier ist eine Ausgabe des Wertes %d!\n", iNumber);Daraus würde ich dann gerne haben:
CString sErrorMessage; sErrorMessage.Format("Hier ist eine Ausgabe des Wertes %d!\n", iNumber); if (ERRORSWITCH) m_pMsgRecorder->WriteMessage("Nachricht: " + sErrorMessage);Hat da jemand eine Idee, dass man das irgendwie schön vereinfacht. Oder bessere Vorschläge?
Danke!!!
-
Vielleicht nochmal um mein Problem zu verdeutlichen. Da die Anzahl der Parameter von TRACE variable ist bzw. von den Symbolen im String abhängig ist %d, %s, ... ist es schwierig da jetzt mit inline zu arbeiten... oder präprozessoranweisungen...
Oder gibt es eine andere Lösung?
Nochmals Danke!
-
Bau Dir eine eigene Class CTrace. Diese sollte ein Singleton liefern. Überschreibe den Operator ().
Dann einfach #undef TRACE und #define TRACE CTrace::TheInstance
Das wars.
-
Das mit beliebigen Parametern ist einfach zu machen.
#ifdef DEBUG #define TRACE debugtrace #else #define TRACE 0 && #endif void debugtrace(bla, ...) { valist... ... }Das einzigste Problem was du aber auch mit Klassenlösungen haben wirst ist das die Strings die im Releasemodus eigentlich nicht mehr genutzt werden trotzdem als Stringliterale vom Compiler auf den Funktions Stack gepackt werden (Warum auch immer...)
Währe mal interessant zu Wissen ob jemand eine bessere Lösung für "Zero" Overhead Tracemeldungen hat.
-
__noop