7.9    Die main()-Funktion

Die main()-Funktion lautet seit dem C99-Standard richtig:

int main(void) {
return 0; // muss nicht verwendet werden
}

Des Weiteren ist auch eine Variante mit zwei Parametern erlaubt:

int main(int argc, char *argv[]) {
return 0; // muss nicht verwendet werden
}

Mehr zu dieser Schreibweise mit den Argumenten argc und argv erfahren Sie in Abschnitt A.4, »Kommandozeilenargumente«.

7.9.1    Der Rückgabewert von main() an das Betriebssystem

Der Rückgabewert beim Beenden eines Programms ist für gewöhnlich 0, wenn das Programm erfolgreich beendet wurde, alles andere bedeutet, dass etwas schiefgelaufen ist.

Da der Rückgabewert von System zu System unterschiedlich ist, haben Sie zur Vereinfachung mit den Makros EXIT_SUCCESS und EXIT_FAILURE einen recht zuverlässigen Weg, um ein Programm zu beenden. Beide sind in der Header-Datei stdlib.h definiert. Damit müssen Sie sich nicht mehr selbst darum kümmern, welchen Wert auf welchem System Sie zurückgeben müssen, um zu melden, ob sich eine Anwendung erfolgreich oder eben nicht erfolgreich beendet hat. Bei einem erfolgreichen Ende geben Sie einfach EXIT_SUCCESS zurück und bei einem Fehler EXIT_FAILURE. Natürlich müssen Sie hierzu auch die Header-Datei stdlib.h mit einbinden. Natürlich funktioniert das nur zusammen mit modernen Compilern, die mindestens den C99-Standard unterstützen.

Impliziter Rückgabewert aus main

Der Funktionsblock von main() muss nicht unbedingt eine return-Anweisung erhalten. Wird das Blockende von main() erreicht, wird implizit 0 als Rückgabewert zurückgegeben.

Es folgt ein einfaches Beispiel zum Beendigungsstatus EXIT_SUCCESS und zu EXIT_FAILURE:

00  // Kapitel7/exit_1.c
01 #include <stdio.h>
02 #include <stdlib.h>

03 int main(void) {
04 int ival = 0;
05 printf("Ganzzahl eingeben: ");
06 if(scanf("%d", &ival) != 1) {
07 printf("Fehler bei der Eingabe!\n");
08 return EXIT_FAILURE;
09 }
10 return EXIT_SUCCESS;
11 }

Listing 7.9    Nur wenn Sie im letzten Beispiel die Zahl 1 eingeben, beendet sich das Programm ordnungsgemäß.

In diesem Beispiel wird in Zeile (06) eine Ganzzahl vom Typ int eingelesen und überprüft, ob scanf() einen Wert ungleich 1 zurückgegeben hat. Das bedeutet, dass kein gültiger (int-)Wert eingelesen bzw. umgewandelt werden konnte. Es wird dann eine Fehlermeldung ausgegeben und das Programm mit dem return-Wert EXIT_FAILURE beendet. Beim normalen Ablauf wird das Programm mit EXIT_SUCCESS in Zeile (10) beendet. Meistens werden Sie dieses Beispiel wahrscheinlich unter Windows ausführen. Dort beendet sich Ihr Programm im Fehlerfall sehr unspektakulär mit der Meldung »Die Anwendung wurde aufgrund eines ungültigen Vorgangs beendet«. Leider ist es hier ohne tiefgreifende Kenntnisse der Windows-API nicht möglich, dem System genauere Informationen zu entlocken.

Das Programm gibt bei der Ausführung Folgendes aus (Linux):

$ ./listing008
Ganzzahl eingeben: 5
$ echo $?
0
$ ./listing008
Ganzzahl eingeben: x
Fehler bei der Eingabe!
$ echo $?
1

Bei der Ausführung des Beispiels wurde außerdem demonstriert, wie Sie den Rückgabewert in einem Linux-, OS X- oder einem beliebigen Unix-Terminal mithilfe der Shell-Variablen $? auswerten können. Diese Variable enthält den Rückgabewert des zuletzt ausgeführten Kommandos. Unter Microsoft-Windows-Systemen können Sie den Errorlevel beispielsweise (noch) im Batch-Modus auswerten. Wie lange dies jedoch noch unterstützt wird, ist nicht abzusehen.