Kapitel 22 Weitere Headerdateien und ihre Funktionen (ANSI C)
In diesem Kapitel sollen Funktionen aus den Standard-Headerdateien näher erläutert werden, die bisher noch nicht oder nur zu kurz zur Sprache gekommen sind. Alle Headerdateien sind vom ANSI C-Komitee vorgeschrieben und somit auf allen Systemen vorhanden.
22.1 <assert.h> -– Testmöglichkeiten und Fehlersuche
 
Mit der Funktion
#include <assert.h>
void assert(int ausdruck);
können Ausdrücke aus einem Programm auf logische Fehler getestet werden. Ist ausdruck gleich 0, wird das Programm mit einer Fehlermeldung beendet. Genauer: Erst wird eine Fehlermeldung auf stderr ausgegeben, etwa:
Assertion failed: ausdruck, file filename, line nnn
Der Dateiname und die Zeilennummern stammen von den Präprozessor-Makros __FILE__ und __LINE__. Danach wird die Ausführung des Prozesses mit der Funktion abort() beendet.
Ein einfaches Beispiel: Es werden zwei Zahlen miteinander dividiert. Dabei darf keine der Zahlen eine Null oder ein negativer Wert sein. Außerdem soll der Teiler nicht größer als der Nenner sein. Hier das Listing:
/* assertion1.c */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int divide(int zahl1, int zahl2) {
assert( (zahl1 >= 0 && zahl1 >= zahl2) && (zahl2 >= 0) );
return zahl1 / zahl2;
}
int main(void) {
printf("%d / %d = %d\n",5,2,divide(5,2));
printf("%d / %d = %d\n",3,4,divide(3,4));
printf("%d / %d = %d\n",4,4,divide(4,4));
return EXIT_SUCCESS;
}
Das Programm wird durch den Funktionsaufruf divide(3,4) mit folgender Fehlermeldung abgebrochen:
Assertion failed: assert( (zahl1>=0 && zahl1>=zahl2) &&
(zahl2>=0) ), file:Pfad_zur_Datei.c, line 6
Diese Art Programme zu testen, eignet sich sehr gut für größere Projekte. Damit Sie nicht den ganzen Code durchsuchen müssen, um anschließend bei der Fertigstellung des Programms die assert()-Anweisungen zu entfernen, müssen Sie nur das Makro
NDEBUG
angeben, und der Compiler ignoriert alle assert()-Aufrufe. NDEBUG muss allerdings noch vor der Headerdatei
#include <assert.h>
angegeben werden. Bei dem folgenden Beispiel wird die assert()-Anweisung ignoriert:
/* assertion2.c */
#include <stdio.h>
#include <stdlib.h>
#define NDEBUG
#include <assert.h>
int divide(int zahl1, int zahl2) {
assert( (zahl1 >= 0 && zahl1 >= zahl2) && (zahl2 >= 0) );
return zahl1 / zahl2;
}
int main(void) {
printf("%d / %d = %d\n",5,2,divide(5,2));
printf("%d / %d = %d\n",3,4,divide(3,4));
printf("%d / %d = %d\n",4,4,divide(4,4));
return EXIT_SUCCESS;
}
|