Tut exit () etwas Besonderes, was 'return' nicht tut?
Bei einigen Compilern für ungewöhnliche Plattformen wird exit()
das Argument möglicherweise in den Exit-Wert Ihres Programms übersetzt, während bei einer Rückgabe von main()
der Wert möglicherweise ohne Übersetzung direkt an die Host-Umgebung übergeben wird.
Der Standard erfordert in diesen Fällen ein identisches Verhalten (insbesondere heißt es, dass die int
Rückgabe von etwas, das mit kompatibel main()
ist, dem Aufruf exit()
mit diesem Wert entsprechen sollte). Das Problem ist, dass verschiedene Betriebssysteme unterschiedliche Konventionen für die Interpretation der Exit-Werte haben. Auf vielen (VIELEN!) Systemen bedeutet 0 Erfolg und alles andere ist ein Fehler. Aber bei VMS bedeuten ungerade Werte Erfolg und gerade Misserfolg. Wenn Sie 0 von zurückgeben main()
, wird einem VMS-Benutzer eine böse Nachricht über eine Zugriffsverletzung angezeigt. Es gab eigentlich keine Zugriffsverletzung - das war einfach die Standardnachricht, die dem Fehlercode 0 zugeordnet war.
Dann kam ANSI und segnete EXIT_SUCCESS
und EXIT_FAILURE
als Argumente, an die man weitergeben konnte exit()
. Die Norm sagt auch , dass exit(0)
sich verhalten sollten identisch exit(EXIT_SUCCESS)
, so dass die meisten Implementierungen definieren EXIT_SUCCESS
zu 0
.
Der Standard daher bringen Sie in einer Bindung auf VMS, wie es läßt keinen einzigen Weg zurückzukehren Ausfall - Code, der den Wert 0 haben passiert.
Der VAX / VMS C-Compiler aus den frühen 1990er Jahren interpretierte daher den Rückgabewert von nicht main()
, sondern gab einfach den Wert an die Hostumgebung zurück. Wenn Sie es jedoch verwenden exit()
würden, würde es das tun, was der Standard erfordert: Übersetzen EXIT_SUCCESS
(oder 0
) in einen Erfolgscode und EXIT_FAILURE
in einen generischen Fehlercode. Um es zu benutzen EXIT_SUCCESS
, musste man es weitergeben exit()
, man konnte es nicht zurückgeben main()
. Ich weiß nicht, ob modernere Versionen dieses Compilers dieses Verhalten beibehalten haben.
Ein tragbares C-Programm, das früher so aussah:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
Nebenbei: Wenn ich mich richtig erinnere, ist die VMS-Konvention für Exit-Werte nuancierter als ungerade / gerade. Tatsächlich werden so etwas wie die niedrigen drei Bits verwendet, um einen Schweregrad zu codieren. Im Allgemeinen zeigten die ungeraden Schweregrade jedoch Erfolg oder verschiedene Informationen an, und die geraden zeigten Fehler an.