Optimierungsgrad im Präprozessor ermitteln?

Lesezeit: 2 Minuten

-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 -Ogzur 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.

  • Sehr gute Idee… “seht selbst!”… wäre ich nicht drauf gekommen. Das ist kein Hack, das ist Ermittlung!

    – Telefontagger

    19. März 2019 um 12:52 Uhr

  • Einzeiler: diff <(gcc -Xpreprocessor -dM -E - < /dev/null) <(gcc -Xpreprocessor -dM -O -E - < /dev/null)

    – Benutzer541686

    8. Juni 2020 um 9:36 Uhr

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.

  • Danke Thomas. Ich dachte nicht, dass es verfügbar ist. Wenn jemand einen cleveren (oder offensichtlichen) Hack herausfindet, könnte ich die akzeptierte Antwort noch einmal durchgehen.

    – jww

    30. Juli 2015 um 9:07 Uhr

  • glibcKopfzeilen von (insbesondere /usr/include/features.h) Suche nach __OPTIMIZE__ Flagge wann _FORTIFY_SOURCE eingestellt ist. Ebenfalls, __OPTIMIZE__ erscheint jetzt in der Liste der Symbole oben verlinkt.

    – Ben Stern

    29. September 2019 um 21:17 Uhr


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.

1367530cookie-checkOptimierungsgrad im Präprozessor ermitteln?

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

Privacy policy