Mein Code ist voll von Anrufen an assert(condition)
. In der Debug-Version verwende ich, g++ -g
die meine Behauptungen auslöst. Unerwarteterweise werden dieselben Behauptungen auch in meiner Release-Version ausgelöst, die ohne -g
Option kompiliert wurde .
Wie kann ich meine Zusicherungen beim Kompilieren vollständig deaktivieren? Sollte ich NDEBUG
in jedem Build, den ich produziere, explizit definieren , unabhängig davon, ob es sich um Debug, Release oder etwas anderes handelt?
-g
entspricht dies-g2
.-g3
könnte eine bessere Wahl sein, da es die symbolischsten Informationen zur Verfügung stellt. Beispielsweise sind unter-g3
symbolische #defines verfügbar. Ich habe jedoch den Eindruck, dass einige Werkzeugketten ersticken-g3
. Viele externe Bibliotheken hängen auch von-DDEBUG
'Debug'-Builds ab (Posix bestätigt dies nur-DNDEBUG
für' Release'-Builds).Antworten:
Sie müssen
#define NDEBUG
(oder das Flag-DNDEBUG
mit g ++ verwenden ), dies wird Assert deaktivieren, solange es vor dem Einfügen der Assert-Header-Datei definiert ist.quelle
#include <assert.h>
?#include <assert.h>
.Verwenden
#define NDEBUG
quelle
;
anstatt, was problematisch sein kann , wenn die imassert
Innern eine istif
, zum Beispiel. Ich bin sicher, dass der Compiler Zeilen wie0;
weg optimiertSie können Assertions entweder vollständig deaktivieren, indem Sie
#define NDEBUG #include <assert.h>
oder Sie können NDEBUG (über -DNDEBUG) in Ihrer Makefile- / Build-Prozedur festlegen, je nachdem, ob Sie eine produktive oder eine Entwicklungsversion wünschen.
quelle
Das
-g
Flag hat keinen Einfluss auf den Betrieb vonassert
, sondern stellt lediglich sicher, dass verschiedene Debugging-Symbole verfügbar sind.Rahmen
NDEBUG
ist die Standardmethode (wie im offiziellen ISO-Standard) zum Deaktivieren von Zusicherungen.quelle
Ja, definieren Sie
NDEBUG
in der Befehlszeile / im Build-System mit der Option Präprozessor / Compiler-DNDEBUG
.Dies hat nichts mit den von eingefügten Debugging-Informationen zu tun
-g
.quelle