2010-03-24 9 views
5

ich die folgende Code-Schnipsel haben:C++ bedingte Kompilierung

#ifdef DO_LOG 
#define log(p) record(p) 
#else 
#define log(p) 
#endif 

void record(char *data){ 
..... 
..... 
} 

Nun, wenn ich log("hello world") in meinem Code aufrufen und DO_LOG nicht definiert ist, wird die Linie, wird mit anderen Worten kompiliert werden essen sie den Speicher bis für die Zeichenfolge "Hallo Welt"?

P.S. Es gibt eine Menge von Aufrufen in dem Programm und es ist Speicher empfindlich, gibt es also eine andere Möglichkeit, kompiliert, so dass es nur auf die #define DO_LOG?

+2

Sie sollten keine eigene Protokollierungsbibliothek implementieren. Da draußen gibt es genug davon. Hier ist, was ich benutze: http://www.templog.org. – sbi

+2

@sbi Ich weiß es nicht. Ich habe mein eigenes geschrieben und es funktioniert wunderbar. Es ist der beste Weg zu lernen, etwas zu tun. :-) – Konrad

+1

@Konrad: Ich tat es auch, aber es ist schwer, besser zu sein als die angesammelte Weisheit einer etablierten Bibliothek. – sbi

Antwort

14

Dies sollte leicht zu überprüfen, indem Sie die resultierende Binärdatei überprüfen.

Ich würde "Nein" sagen, da der Ausdruck vollständig verschwindet, wird der Compiler die Zeichenfolge niemals sehen (sie wird durch die Makroexpansion des Präprozessors entfernt).

+1

Das ist richtig. Und ein Programm zu schreiben, um zu verifizieren, dauerte mich alle 30 Sekunden. –

+2

@unwind & @Neil: Mich würde interessieren, wie du verifiziert hast, dass das beobachtete Verhalten nicht nur eine Eigenheit deines Compilers ist. – sbi

+0

@sbi: Ich habe nicht, ich gebe es gerne zu. Ich denke, dass die Logik, die ich in meiner Antwort verwende, gesund ist; das Präprozessor-Makro muss funktionieren wie definiert, d. h. das Zeichenfolgenliteral verschwindet aus der Quelle. Fühlen Sie sich frei, Standards zu zitieren, wenn das falsch ist, würde ich mich freuen zu wissen. – unwind

4

Da der Präprozessor vor dem Compiler ausgeführt wird, ist die Zeile nicht einmal vorhanden, wenn der Compiler ausgeführt wird. Also die Antwort ist nein, es verwendet überhaupt keine Speicher.

4

Nein, es wird nicht in der Binärdatei sein. Es wird nicht einmal kompiliert werden - der Präprozessor wird es vor der Kompilierung in eine leere Zeichenfolge erweitern, so dass der Compiler es nicht einmal sehen wird.

2

Nein. Der Präprozessor wird vor der Kompilierung ausgeführt und der Code wird daher nie angezeigt. Ich möchte hinzufügen, dass wenn Sie daran interessiert sind, Protokollierung zu Ihrer C++ - Anwendung hinzuzufügen, möchten Sie möglicherweise die Log4Cxx-Bibliothek verwenden. Es verwendet ähnliche Makros, die Sie vollständig aus Ihrer Anwendung entfernen können, aber wenn die Protokollierung aktiviert ist, unterstützt es verschiedene Protokollebenen (basierend auf Wichtigkeit/Schweregrad) sowie mehrere verschiedene "Appender", an die Protokollierungsausgaben gesendet werden (z. B. syslog , Konsole, Dateien, Netzwerk-E/A usw.).

Die vollständige API-Dokumentation finden Sie unter Log4Cxx API docs. Wenn Sie Java-Entwickler an Bord haben, die Log4J verwendet haben, sollten sie sich mit Log4Cxx (und davon überzeugt, sie zu benutzen) sofort zuhause fühlen.