-Og
ist eine relativ neue Optimierungsoption, die das Debugging-Erlebnis verbessern soll, während Optimierungen angewendet werden. Wenn ein Benutzer auswählt -Og
, dann möchte ich, dass meine Quelldateien alternative Codepfade aktivieren, um das Debugging-Erlebnis zu verbessern. GCC bietet die __OPTIMIZE__
Präprozessor-Makroaber es wird nur auf 1 gesetzt, wenn Optimierungen wirksam sind.
Gibt es eine Möglichkeit, die Optimierungsstufe zu lernen, z -O1
, -O3
oder -Og
zur Verwendung mit dem Präprozessor?
Ich weiß nicht, ob das ein cleverer Hack ist, aber es ist ein Hack.
$ gcc -Xpreprocessor -dM -E - < /dev/null > 1
$ gcc -Xpreprocessor -dM -O -E - < /dev/null > 2
$ diff 1 2
53a54
> #define __OPTIMIZE__ 1
68a70
> #define _FORTIFY_SOURCE 2
154d155
< #define __NO_INLINE__ 1
clang hat das FORTIFY nicht produziert.
Ich glaube, es ist nicht möglich, direkt die Optimierungsstufe zu kennen, die zum Kompilieren der Software verwendet wurde, da dies nicht der Fall ist die Liste der definierten Präprozessorsymbole
Darauf konnte man sich verlassen -DNDEBUG
(kein Debug), das verwendet wird, um Assertionen im Freigabecode zu deaktivieren und in diesem Fall Ihren „Debug“-Codepfad zu aktivieren.
Ich glaube jedoch, dass es besser ist, einen systemweiten Satz von Symbolen lokal für Ihr Projekt zu haben und den Benutzer explizit auswählen zu lassen, was er verwenden möchte.:
MYPROJECT_DNDEBUG
MYPROJECT_OPTIMIZE
MYPROJECT_OPTIMIZE_AGGRESSIVELY
Dies macht das Debuggen oder die Verhaltensunterschiede zwischen Release/Debug viel einfacher, da Sie die verschiedenen Verhaltensweisen schrittweise ein- und ausschalten können.
Abhängig von Ihrem Ziel existieren einige systemspezifische Präprozessor-Makros. Beispielsweise verfügt die Microchip-spezifische XC16-Variante von gcc (derzeit basierend auf gcc 4.5.1) über das Präprozessor-Makro __OPTIMIZATION_LEVEL__
das die Werte 0, 1, 2, s oder 3 annimmt.
Beachten Sie, dass das Überschreiben der Optimierung für eine bestimmte Routine, z. B. mit __attribute__((optimize(0)))
ändert den Wert von nicht __OPTIMIZE__
oder __OPTIMIZATION_LEVEL__
innerhalb dieser Routine.
13675300cookie-checkOptimierungsgrad im Präprozessor ermitteln?yes