C++ ermittelt, ob mit Debugsymbolen kompiliert wird, ohne ein Präprozessorsymbol zu definieren

Lesezeit: 2 Minuten

Benutzer-Avatar
Steven Lu

Ich habe so etwas verwendet:

int main(int argc, char *argv[])
{

#ifdef DEBUG
    printf("RUNNING DEBUG BUILD");
#else
    printf("Running... this is a release build.");
#endif
...

Dies erfordert jedoch, dass ich mit -DDEBUG für den Debug-Build kompiliere. Gibt mir GCC eine Möglichkeit zu bestimmen, wann ich mit Debug-Symbolen (Flag -g) kompiliere, wie z. B. das Definieren eines eigenen Präprozessor-Makros, nach dem ich suchen kann?

  • Ich weiß es nicht genau, aber ich bezweifle es stark. Theoretisch könnte die Vorverarbeitung in einem separaten Durchgang mit dem erfolgen cpp Befehl vor der Kompilierung, und der Präprozessor hat keine Ahnung von Debugging-Symbolen oder der -g Möglichkeit.

    – Adam Rosenfield

    7. März 2011 um 18:06 Uhr

Benutzer-Avatar
JoeSlaw

Antwort ist nein. Normalerweise werden diese Makros (DEBUG, NDEBUG, _DEBUG) vom IDE/Make-System abhängig davon gesetzt, welche Konfiguration (Debug/Release) Sie aktiv haben. Ich denke, diese Antworten können hilfreich sein:

C #define-Makro für das Debug-Drucken

Woher kommt normalerweise der -DNDEBUG?

_DEBUG gegen NDEBUG

  • Ich habe mir NetBeans angesehen – es scheint, dass diese IDE Ihnen zumindest keine spezifischen Debug-Flags zur Verfügung stellt, also habe ich am Ende eine manuelle Definition durchgeführt, dh -DDEBUG in der g++-Befehlszeile (in den Projektoptionen).

    – Pete855217

    16. April 2013 um 14:13 Uhr

Ich denke, die Antwort, nach der ich gesucht habe, war im Wesentlichen das, was Adam als Kommentar gepostet hat, nämlich:

Die Aufgabe des Compilers umfasst keine Vorverarbeitung, und tatsächlich wird der Compiler alle Präprozessorschalter verschlucken, die nicht vom Präprozessor verarbeitet werden und in den Code gelangen.

Da der Weg zum Verzweigen von Code also den Präprozessor nutzen muss, bedeutet dies die Zeit des Compilers bekommt Jeder Code ist bereits der eine oder andere (Debug-Code oder Release-Code), daher ist es für mich unmöglich, das zu tun, was meine Frage in diesem Stadium (nach dem Präprozessor) verlangt.

Es ist also eine direkte Folge davon, dass der Präprozessor als separater Prozess zum Durchführen des Codes konzipiert ist.

  • Sie müssen sowieso andere Optionen für den Compiler haben, also warum nicht sicherstellen, dass die NDEBUG Symbol ist auch passend definiert?

    – Michael Burr

    3. Januar 2015 um 7:50 Uhr

  • Nun ja. warum nicht. So wird es gelehrt, so muss es verwendet werden, und das ist der Grund, warum es so ist. (Konzeptionell und idealerweise sollte es nur ein Flag geben, das dies steuert, aber in der Praxis müssen wir beide verwenden -g und -DDEBUG)

    – Steven Lu

    3. Januar 2015 um 8:33 Uhr


  • Vergessen Sie nicht, dass das Vorhandensein von Symbolen nicht bedeutet, dass es sich um einen „Debug“- oder nicht optimierten Build handelt. Für jede Art von Build können Symbole generiert werden.

    – Michael Burr

    3. Januar 2015 um 19:38 Uhr

1373300cookie-checkC++ ermittelt, ob mit Debugsymbolen kompiliert wird, ohne ein Präprozessorsymbol zu definieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy