7.10 Programme mit exit() beenden
Wollen Sie ein Programm an einer beliebigen Position beenden, können Sie die Funktion exit() aus der Header-Datei stdlib.h dazu verwenden. Diese Funktion dient dazu, ein Programm »ordentlich« mit einem Statuswert, der als Parameter z. B. an Ihre Konsole zurückgegeben wird, zu beenden. Auch hier gilt, wie schon bei der Rückgabe mittels return aus der main()-Funktion, dass in der Regel der Wert 0 verwendet wird, wenn ein Programm erfolgreich beendet wurde. Daher bietet es sich auch hier an, die Makros EXIT_SUCCESS und EXIT_FAILURE zu verwenden, um eine erfolgreiche bzw. fehlerhafte Beendigung des Programms zurückzugeben.
Es folgt ein einfaches Beispiel hierzu:
00 // Kapitel7/exit_2.c
01 #include <stdio.h>
02 #include <stdlib.h>
03 int readint(void) {
04 int val = 0;
05 printf("Bitte eine Ganzzahl eingeben: ");
06 if(scanf("%d", &val) != 1) {
07 printf("Fehler bei der Eingabe!\n");
08 exit(EXIT_FAILURE);
09 }
10 return val;
11 }
12 int main(void) {
13 int ival = readint();
14 printf("Der Wert lautet: %d\n", ival);
15 return EXIT_SUCCESS;
16 }
Das Beispiel entspricht im Grunde dem Listing 7.9, nur wurde hier das Einlesen des int-Wertes in die Funktion in den Zeilen (03) bis (11) ausgelagert. Wenn scanf() den eingegebenen Wert nicht korrekt in eine Integer-Zahl umwandeln konnte, beendet die Funktion readint() in Zeile (08) das komplette Programm mithilfe der Funktion exit().
Wenn Sie die main()-Funktion mit exit() beenden, ist dies gleichwertig zur Beendigung mit einem return innerhalb von main().
Funktionen ohne Wiederkehr (seit C11)
Einige Funktionen kehren aus verschiedenen Gründen nicht mehr zu ihrem Aufrufer zurück und beenden das Programm. Die Funktionen exit() oder abort() sind zwei solche Vertreter aus der Standardbibliothek. Oftmals werden auch eigene Exit-Funktionen geschrieben, um vor der Beendigung beispielsweise noch Aufräumarbeiten durchzuführen. Mit dem neuen Schlüsselwort _Noreturn können Sie seit C11 selbst eine solche Funktion wie exit() oder abort() markieren, die nicht mehr zu ihrem Aufrufer zurückkehrt. Der Vorteil dieses Schlüsselworts liegt darin, dass der Compiler mit diesem Wissen einen besseren Code erstellen kann und so auch eine sinnvollere Aussage von Analysewerkzeugen erwartet werden kann. Ein Beispiel hierfür wäre:
_Noreturn void function(); // C11, kehrt niemals zurück