Welche Präprozessordefinition sollte verwendet werden, um Debug-Codeabschnitte anzugeben?
Verwenden Sie #ifdef _DEBUG
oder #ifndef NDEBUG
oder gibt es einen besseren Weg, um es zu tun, z #define MY_DEBUG
.
Ich denke, _DEBUG
ist Visual Studio spezifisch, ist NDEBUG Standard?
Ja, es ist ein Standardmakro mit der semantischen Bezeichnung "Nicht debuggen" für die Standards C89, C99, C ++ 98, C ++ 2003, C ++ 2011, C ++ 2014.
_DEBUG
Die Standards enthalten keine Makros.C ++ 2003 Standard Senden Sie den Reader auf "Seite 326" unter "17.4.2.1 Header" an Standard C.
In C89 (C-Programmierer nannten diesen Standard als Standard C) wurde im Abschnitt "4.2 DIAGNOSE" gesagt
Wenn Sie sich die Bedeutung von
_DEBUG
Makros in Visual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx ansehen , wird ersichtlich, dass dieses Makro automatisch durch Ihre Wahl der Version der Sprachlaufzeitbibliothek definiert wird.quelle
Ich verlasse mich darauf
NDEBUG
, weil es das einzige ist, dessen Verhalten über Compiler und Implementierungen hinweg standardisiert ist (siehe Dokumentation für das Standard-Assert-Makro). Die negative Logik ist ein kleiner Speedbump für die Lesbarkeit, aber es ist eine gängige Redewendung, an die Sie sich schnell anpassen können.Sich auf so etwas zu verlassen,
_DEBUG
würde bedeuten, sich auf ein Implementierungsdetail eines bestimmten Compilers und einer bestimmten Bibliotheksimplementierung zu verlassen. Andere Compiler können dieselbe Konvention wählen oder nicht.Die dritte Möglichkeit besteht darin, ein eigenes Makro für Ihr Projekt zu definieren, was durchaus sinnvoll ist. Mit Ihrem eigenen Makro können Sie Implementierungen über Implementierungen hinweg durchführen und Ihren Debugging-Code unabhängig von den Zusicherungen aktivieren oder deaktivieren. Im Allgemeinen rate ich jedoch davon ab, verschiedene Klassen von Debugging-Informationen zu haben, die zur Kompilierungszeit aktiviert werden, da dies zu einer Zunahme der Anzahl von Konfigurationen führt, die Sie erstellen (und testen) müssen, um einen wohl geringen Nutzen zu erzielen.
Wenn Sie bei einer dieser Optionen Code von Drittanbietern als Teil Ihres Projekts verwenden, müssen Sie wissen, welche Konvention verwendet wird.
quelle
#if !defined(NDEBUG)
<- @HostileFork hast du das nicht gemeint?#if
nicht#ifdef
?#ifdef NDEBUG
... aber dann besondere Aufmerksamkeit auf die negative Logik mit gelenkt wird#if !defined(NDEBUG)
. Ansonsten ist es ein wenig schwierig, das n in#ifndef NDEBUG
"Das Makro
NDEBUG
steuert, obassert()
Anweisungen aktiv sind oder nicht.Meiner Ansicht nach unterscheidet sich das von jedem anderen Debugging. Daher verwende ich etwas anderes als
NDEBUG
die Steuerung der Debugging-Informationen im Programm. Was ich benutze, hängt vom Framework ab, mit dem ich arbeite. Verschiedene Systeme haben unterschiedliche Aktivierungsmakros, und ich verwende alles, was angemessen ist.Wenn es kein Framework gibt, würde ich einen Namen ohne führenden Unterstrich verwenden. Diese sind in der Regel der Implementierung vorbehalten, und ich versuche, Probleme mit Namenskollisionen zu vermeiden - doppelt so, wenn der Name ein Makro ist.
quelle
#if
Einfügen von Behauptungen in eine Kategorie und von kontrolliertem Code in die andere.assert(huge_object.IsValid());
könnte langsam sein, während esassert(ptr != nullptr);
wahrscheinlich nicht ist. Ich stimme Jonathan zu, dass sich Protokollierung und Ablaufverfolgung wahrscheinlich von Behauptungen unterscheiden sollten, zumindest in größeren Projekten, aber ich denke nicht an Protokollierung oder Ablaufverfolgung als Debug-Code, weshalb ich um Klarstellung gebeten habe.Seien Sie konsequent und es spielt keine Rolle, welche. Auch wenn Sie aus irgendeinem Grund mit einem anderen Programm oder Tool unter Verwendung einer bestimmten DEBUG-Kennung zusammenarbeiten müssen, ist dies einfach
quelle
Ist leider
DEBUG
stark überlastet. Beispielsweise wird empfohlen, immer eine PDF-Datei für RELEASE-Builds zu generieren und zu speichern. Was bedeutet, eines der-Zx
Flags und-DEBUG
Linker-Option. While_DEBUG
bezieht sich auf spezielle Debug-Versionen der Laufzeitbibliothek, z. B. Aufrufe vonmalloc
undfree
. DannNDEBUG
werden Zusicherungen deaktiviert.quelle