Heim  >  Artikel  >  Web-Frontend  >  Zusammenfassung der Verwendung der Funktion „asser()“ (empfohlen)

Zusammenfassung der Verwendung der Funktion „asser()“ (empfohlen)

高洛峰
高洛峰Original
2017-02-03 14:29:181647Durchsuche

Der Prototyp des

assert-Makros ist in b0f0cbacb9a934b30cb1dd71186a65c7 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 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&#39; 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 b0f0cbacb9a934b30cb1dd71186a65c7 enthält. Der Beispielcode lautet wie folgt:

#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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn