Ich dachte immer, assert sei nur eine Funktion zur Fehlerberichterstattung, aber tatsächlich ist es ein Makro, und sein Zweck ist nicht die "Fehlerberichterstattung".

Nachdem ich ein gewisses Verständnis dafür gewonnen hatte, stellte ich fest, dass die Verwendung von assert() einer Art "Vertragsprogrammierung" ähnelt. Meinem Verständnis nach bedeutet es, dass das Programm unter meinen Annahmen normal und gut funktionieren kann. Tatsächlich ist es äquivalent zu einer if-Anweisung:

if(假设成立)
{
     程序正常运行;
}
else
{
      报错&&终止程序!(避免由程序运行引起更大的错误)  
}

Aber wenn man es so schreiben würde, würde das zu unzähligen if-Anweisungen führen, und es könnte sogar vorkommen, dass sich die Klammern einer if-Anweisung vom Anfang bis zum Ende einer Datei erstrecken. Darüber hinaus sind die Annahmen, die wir überprüfen müssen, in den meisten Fällen nur nebensächliche Ereignisse, oder wir wollen einfach testen, ob einige Worst-Case-Szenarien auftreten. Deshalb gibt es assert().

Der Prototyp des assert-Makros ist in assert.h definiert. Seine Funktion besteht darin, die Programmausführung zu beenden, wenn seine Bedingung einen Fehler zurückgibt.

#include "assert.h" 
void assert( int expression );

Die Rolle von assert besteht darin, zuerst den Ausdruck expression auszuwerten; wenn sein Wert falsch (d. h. 0) ist, gibt es zuerst eine Fehlermeldung an stderr aus und beendet dann die Programmausführung durch Aufruf von abort.

Der Nachteil der Verwendung von assert besteht darin, dass häufige Aufrufe die Programmleistung stark beeinträchtigen und zusätzlichen Overhead verursachen können.

Nach dem Debuggen können Sie assert-Aufrufe deaktivieren, indem Sie #define NDEBUG vor der #include-Anweisung einfügen. Beispielcode ist wie folgt:

#include 
#define NDEBUG 
#include

Zusammenfassung der Verwendung und Vorsichtsmaßnahmen

1) Überprüfen Sie die Gültigkeit eingehender Parameter am Anfang der Funktion.

Zum Beispiel:

int resetBufferSize(int nNewSize) 
{ 
//功能:改变缓冲区大小, 
//参数:nNewSize 缓冲区新长度 
//返回值:缓冲区当前长度 
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 
assert(nNewSize >= 0); 
assert(nNewSize <= MAX_BUFFER_SIZE); 
 
... 
}

2) Jedes assert sollte nur eine Bedingung prüfen, denn wenn mehrere Bedingungen gleichzeitig geprüft werden und die Assertion fehlschlägt, ist es unmöglich, intuitiv zu bestimmen, welche Bedingung fehlgeschlagen ist.

     

Nicht gut:

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 
    

Gut:

assert(nOffset >= 0); 
assert(nOffset+nSize <= m_nInfomationSize); 

3) Verwenden Sie keine Anweisungen, die die Umgebung verändern, denn assert wird nur in DEBUG wirksam. Wenn Sie dies tun, verursacht es Probleme, wenn das Programm tatsächlich ausgeführt wird.

Falsch: assert(i++ < 100)

Dies liegt daran, dass diese Anweisung nicht ausgeführt wird, wenn ein Fehler auftritt, zum Beispiel wenn i=100 vor der Ausführung ist, sodass der Befehl i++ nicht ausgeführt wird.

Richtig:

assert(i < 100)
i++; 

4) Zwischen assert und der folgenden Anweisung sollte eine Leerzeile stehen, um ein logisches und visuelles Gefühl von Konsistenz zu erzeugen.

  

5) An manchen Stellen kann assert die bedingte Filterung nicht ersetzen.

  

Programme werden im Allgemeinen in Debug-Versionen und Release-Versionen unterteilt. Debug-Versionen werden für die interne Fehlersuche verwendet, und Release-Versionen werden an Benutzer verteilt. Die Assertion assert ist ein Makro, das nur in Debug-Versionen wirksam ist; sie wird verwendet, um Situationen zu prüfen, die „nicht auftreten sollten“. Das Folgende ist ein Speicherkopierprogramm. Während der Ausführung wird das Programm beendet, wenn der Parameter von assert falsch ist (normalerweise erscheint ein Hinweisdialog, der angibt, wo assert ausgelöst wurde).

Im Folgenden finden Sie mehrere Grundsätze für die Verwendung von Assertions:

  • (1) Verwenden Sie Assertions, um illegale Situationen abzufangen, die nicht auftreten sollten. Verwechseln Sie nicht den Unterschied zwischen illegalen Situationen und Fehlersituationen; Letztere existieren zwangsläufig und müssen behandelt werden.
  • (2) Verwenden Sie Assertions, um die Parameter von Funktionen zu überprüfen.
  • (3) Wenn Sie Funktionen schreiben, prüfen Sie wiederholt und fragen Sie sich: „Welche Annahmen beabsichtige ich zu treffen?“ Sobald eine Annahme festgelegt ist, verwenden Sie Assertions, um die Annahme zu überprüfen.
  • (4) Allgemeine Lehrbücher ermutigen Programmierer, defensive Programmierung durchzuführen, aber denken Sie daran, dass dieser Programmierstil Fehler verbergen kann. Wenn Sie defensive Programmierung durchführen und etwas, das „nicht passieren kann“, tatsächlich passiert, verwenden Sie Assertions, um einen Alarm auszulösen.

ASSERT() ist ein Makro, das häufig beim Debuggen von Programmen verwendet wird. Zur Laufzeit wertet es den Ausdruck in den Klammern aus. Wenn der Ausdruck FALSE (0) ist, gibt das Programm einen Fehler aus und beendet die Ausführung. Wenn der Ausdruck nicht 0 ist, werden die nachfolgenden Anweisungen weiter ausgeführt. Dieses Makro wird normalerweise verwendet, um festzustellen, ob offensichtlich ungültige Daten im Programm aufgetreten sind; wenn ja, beendet es das Programm, um schwerwiegende Konsequenzen zu vermeiden, und erleichtert auch das Auffinden von Fehlern.

ASSERT ist nur in Debug-Versionen gültig; es wird ignoriert, wenn es als Release-Version kompiliert wird.

Original-URL: https://www.cnblogs.com/thisway/p/5558914.html