Der Prototyp des Assert-Makros ist in
#include <assert.h> void assert( int expression );
Die Funktion von Assert besteht darin, den aktuellen Ausdruck zu berechnen. 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 sehen Sie sich die folgende Programmliste 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“ fehlgeschlagen.
Der Nachteil der Verwendung von „asset()“ besteht darin, dass häufige Aufrufe die Leistung des Programms stark beeinträchtigen und zusätzlichen Overhead verursachen. Nach dem Debuggen können Sie den Assert-Aufruf deaktivieren, indem Sie #define NDEBUG vor der Anweisung mit #include
#include <stdio.h> #define NDEBUG #include <assert.h>
Verwendungszusammenfassung und Vorsichtsmaßnahmen:
1) Überprüfen Sie die Rechtmäßigkeit der eingehenden Parameter zu Beginn der Funktion, z. B.
int resetBufferSize(int nNewSize) { //功能:改变缓冲区大小, //参数:nNewSize 缓冲区新长度 //返回值:缓冲区当前长度 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); ... }
2) Jede Behauptung testet nur eine Bedingung, da mehrere Bedingungen gleichzeitig getestet werden Wenn die Behauptung fehlschlägt, kann sie nicht intuitiv beurteilen, welche Bedingung fehlgeschlagen ist, wie zum Beispiel:
Schlecht:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
Gut:
assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize);
3) Aussagen, die sich ändern Die Umgebung kann nicht verwendet werden, da sie nur bei DEBUG wirksam wird. Wenn Sie dies tun, treten Probleme auf, wenn das Programm tatsächlich ausgeführt wird, z. B.:
Fehler:
assert(i++ < 100);
Dies liegt daran, dass, wenn ein Fehler auftritt, z. B. vor der Ausführung von i=100, diese Anweisung nicht ausgeführt wird und der Befehl i++ nicht ausgeführt wird.
Richtig:
assert(i < 100); i++;
4) Die Behauptung und die nachfolgenden Anweisungen sollten in einer Leerzeile 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 Verwendung der Funktion „asser()“ Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!