Der Prototyp des
assert-Makros ist in
#include <assert.h> void assert( int expression );
Die Funktion von Assert besteht darin, den Ausdruck Ausdruck auszuwerten. Wenn sein Wert falsch ist (dh 0), wird zunächst eine Fehlermeldung an stderr ausgegeben und dann das Programm durch Aufrufen von Abort beendet. Bitte schauen Sie sich die folgende Programmauflistung badptr.c an:
#include <stdio.h> #include <assert.h> #include <stdlib.h> int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert( fp ); //所以这里不会出错 fclose( fp ); fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败 assert( fp ); //所以这里出错 fclose( fp ); //程序永远都执行不到这里来 return 0; }
[root@localhost error_process]# gcc badptr.c [root@localhost error_process]# ./a.out a.out: badptr.c:14: main: Assertion `fp' failed.
Der Nachteil der Verwendung von Assert() besteht darin, dass häufige Aufrufe die Leistung des Programms Adds stark beeinträchtigen zusätzlicher Overhead. Nach dem Debuggen können Sie den Assert-Aufruf deaktivieren, indem Sie #define NDEBUG vor der Anweisung einfügen, die #include
#include <stdio.h> #define NDEBUG #include <assert.h>
Verwendung Zusammenfassung Hinweise:
1) Überprüfen Sie die Rechtmäßigkeit der eingehenden Parameter zu Beginn der Funktion, wie zum Beispiel:
int resetBufferSize(int nNewSize) { //功能:改变缓冲区大小, //参数:nNewSize 缓冲区新长度 //返回值:缓冲区当前长度 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); ... }
2) Jede Behauptung prüft nur einen Bedingung: Denn wenn mehrere Bedingungen gleichzeitig getestet werden und die Behauptung fehlschlägt, ist es unmöglich, intuitiv zu bestimmen, welche Bedingung fehlgeschlagen ist, z. B.:
Schlecht:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
Gut:
assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize);
3) Anweisungen, die die Umgebung ändern, können nicht verwendet werden, da „asser“ nur in DEBUG wirksam wird. Wenn Sie dies tun, treten Probleme auf Das Programm wird tatsächlich ausgeführt, z. B.:
Fehler:
assert(i++ < 100);
Dies liegt daran, dass vor der Ausführung ein Fehler auftritt, z. B. i = 100 Diese Anweisung wird nicht ausgeführt, dann wird der Befehl i++ nicht erzwungen.
Richtig:
assert(i < 100); i++;
4) Die Behauptung und die nachfolgenden Anweisungen sollten in einer leeren Zeile stehen, um ein Gefühl der logischen und visuellen Konsistenz zu erzeugen.
5) Assert kann an manchen Stellen die bedingte Filterung nicht ersetzen.
Das Obige ist eine Zusammenfassung der vom Herausgeber eingeführten Funktion „asser()“. Ich hoffe, dass sie für Sie hilfreich ist. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen antworten rechtzeitig.
Weitere Artikel zur Zusammenfassung der Verwendung der Funktion „asser()“ (empfohlen) finden Sie auf der chinesischen PHP-Website!