MSVC definiert _DEBUG
im Debug-Modus, gcc definiert NDEBUG
im Release-Modus. Mit welchem Makro kann ich im Clang feststellen, ob der Code für die Veröffentlichung oder das Debuggen kompiliert wird?
Wenn Sie sich die Projekteinstellungen Ihrer IDE ansehen, werden Sie sehen, dass diese Makros tatsächlich dort manuell definiert sind, sie werden nicht automatisch vom Compiler definiert. In der Tat gibt es keine Möglichkeit für den Compiler, tatsächlich zu wissen, ob es ein "Debug" oder "Release" erstellt, es baut nur abhängig von den Flags, die ihm vom Benutzer (oder IDE) zur Verfügung gestellt werden.
Sie müssen Ihre eigenen Makros erstellen und sie manuell definieren, genau wie es die IDE beim Erstellen der Projekte tut.
Compiler definieren diese Makros nicht. Deine IDE / Makefile / <insert build system here>
tut es. Dies hängt nicht vom Compiler ab, sondern vom verwendeten Umgebung / Build-Hilfsprogramm.
Die Konvention definiert das Makro DEBUG
im Debug-Modus und das Makro NDEBUG
im Freigabe-Modus.
In einem Befehlszeilencompiler gibt es keinen Debugmodus . Das ist eine IDE-Sache: Es richtet nur einige Optionen ein, die an den Compiler gesendet werden sollen.
Wenn Sie clang
von der Befehlszeile aus verwenden, können Sie verwenden, was Sie wollen. Dasselbe gilt für gcc
. Wenn Sie also mit gcc
NDEBUG
verwenden, können Sie genau das gleiche verwenden.
Sie können das Flag __OPTIMIZE__
verwenden, um festzustellen, ob eine Optimierung stattfindet. Das bedeutet im Allgemeinen, dass es kein Debug-Build ist, da Optimierungen oft die Code-Sequenz neu anordnen. Der Versuch, den optimierten Code zu durchlaufen, kann verwirrend sein.
Das ist wahrscheinlich das, was diejenigen, die am meisten an dieser Frage interessiert sind, wirklich versuchen herauszufinden.