Ihre Anwendung funktioniert wie beabsichtigt. Die Assertion schlägt fehl (da die übergebenen Werte nicht gleich sind, erhält das Makro assert
0) und Ihr Programm wird abgebrochen. So funktioniert es:
Wenn NDEBUG nicht definiert ist, prüft assert, ob sein Argument (welches muss skalaren Typ haben) vergleicht gleich null. Wenn ja, behaupten Sie gibt implementierungsspezifische Diagnoseinformationen auf dem Standard aus Fehlerausgabe und ruft std :: abort auf.
Betonung meiner.
Überprüfen Sie diese Assert-Referenz , um weitere Informationen zu erhalten.
Ich bin gerade auf diesen Fehler gestoßen, als ich versuchte, ein Programm auf einem Raspberry Pi zu debuggen. Das Programm verwendet das GPIO in einer Weise, die erfordert, dass das Programm als root ausgeführt wird. Zum Beispiel führe ich das Programm aus, das ich so geschrieben habe:
%Vor%Ich habe dies jedoch vergessen, als ich den Debugger gestartet habe und
versucht habe %Vor%Und ich habe den Fehler, den Sie anscheinend begegnet sind:
%Vor%Wenn ich es mit Sudo ausgeführt habe, hat es funktioniert.
%Vor%Ich hoffe, das ist hilfreich für jemanden im selben Boot.
Dies sollte Sie über die Verwendung der Assert-Funktion
auf dem Laufenden halten %Vor%Bewerten Sie die Behauptung Wenn der Argumentausdruck dieses Makros mit der funktionalen Form gleich Null ist (d. H. Der Ausdruck ist falsch), wird eine Nachricht in das Standardfehlergerät geschrieben, und der Abbruch wird aufgerufen, wodurch die Programmausführung beendet wird.
Die Einzelheiten der angezeigten Nachricht hängen von der spezifischen Implementierung im Compiler ab. Sie müssen jedoch Folgendes enthalten: den Ausdruck, dessen Assertion fehlgeschlagen ist, den Namen der Quelldatei und die Zeilennummer, an der sie aufgetreten ist. Ein übliches Ausdrucksformat ist:
Assertion failed: Ausdruck, Dateiname, Zeilennummer Dieses Makro ist deaktiviert, wenn zum Zeitpunkt des Einfügens von assert.h bereits ein Makro mit dem Namen NDEBUG definiert wurde. Dies ermöglicht es einem Codierer, während des Debuggens des Programms viele Asser-Aufrufe in einen Quellcode einzuschließen und dann alle für die Produktionsversion zu deaktivieren, indem er einfach eine Zeile wie folgt einfügt:
%Vor%Daher ist dieses Makro so konzipiert, dass es Programmierfehler, nicht Benutzer- oder Lauffehler, erfasst, da es im Allgemeinen deaktiviert wird, nachdem ein Programm seine Debugging-Phase beendet hat. aus: C ++ Ref