Warum Standardrückgabewert der Haupt 0 ist und nicht EXIT_SUCCESS?
Frage
Die ISO 1998 C ++ Standard legt fest, dass nicht explizit eine return-Anweisung in der Haupt ist äquivalent zu verwenden return 0
.
Was aber, wenn eine Implementierung hat einen anderen Standard „keinen Fehler“ Code, zum Beispiel -1
?
Warum nicht den Standard-Makro EXIT_SUCCESS
verwenden, die von 0
oder -1
oder einem anderen Wert ersetzt entweder abhängig von der Implementierung würde?
C ++ scheint die semantischen des Programms zu zwingen, die nicht die Rolle einer Sprache, die nur beschreiben soll, wie das Programm verhält. Darüber hinaus ist die Situation anders für den „Fehler“ Rückgabewert: nur EXIT_FAILURE
ist ein Standard „Fehler“ Beendungsflag, ohne expliziten Wert, wie „1“ zum Beispiel
Was sind die Gründe für diese Entscheidungen?
Lösung
Rückkehr Null von main()
tut im Wesentlichen das gleiche wie das, was Sie fragen. Null von main()
der Rückkehr nicht über Null auf die Host-Umgebung zurückzukehren.
Von der C90 / C99 / C ++ 98-Standard-Dokument:
Wenn der Wert des Status Null oder
EXIT_SUCCESS
, eine Implementierung definiert Form des Status erfolgreiche Beendigung zurückgeführt wird.
Andere Tipps
Eigentlich wird, return 0
nicht unbedingt 0 zurück! Ich zitiere den C-Standard hier, weil es ist, was ich am besten kenne.
Über return
in main()
:
5.1.2.2.3 Programmabbruch
Wenn der Rückgabetyp der Hauptfunktion eine Art kompatibel mit
int
ist, eine Rückkehr von dem ursprünglichen Aufruf dermain
Funktion entspricht dieexit
Funktion mit dem Wert Aufruf durch diemain
Funktion als Argument zurückgegeben;
Über exit()
:
7.20.4.3 Die Exit-Funktion
Überblick#include <stdlib.h> void exit(int status);
[...]
Schließlich wird die Steuerung an die Host-Umgebung zurück. Wenn der Wert vonstatus
Null oderEXIT_SUCCESS
, eine Implementierung definiert Form des Status erfolgreiche Beendigung ist zurückgegeben.
Der Standard macht einfach eine Bestimmung auf, was der Wert sein muss, wenn nicht explizit festgelegt. Es ist bis zu den Entwicklern entweder explizit den Rückgabewert gesetzt oder eine entsprechende semantische für die Standardnehmen. Ich glaube nicht, die Sprache keine Semantik zu zwingen versucht, auf die Entwickler.
0 ist der Standard (Erfolg) Exit-Code auf allen POSIX-Systemen, und alle Systeme, die ich kenne! Ich denke, dass es auf diese Weise sinc Zeit begain wurde (oder zumindest seit Unix tat ...) So ist es aus diesem Grunde ist würde ich sagen.
Was System wissen Sie, das ist anders?
0 als Rückgabecode für den Erfolg, und postive ganzen Zahlen als Fehler ist der Standard in C und Unix. Dieses Schema wurde gewählt, weil normalerweise eine kümmert sich nicht darum, warum ein Programm gelungen , nur, dass es tat. Auf der anderen Seite gibt es viele Möglichkeiten für ein Programm mit einem Fehler zum Scheitern verurteilt, und man wird oft in diesen Informationen interessiert. Daher macht es einen skalaren Wert für den Erfolg zu verwenden, erfassen und einen Wertebereich für Fehler. Mit positiven ganzen Zahlen ist ein Speicher sparende C-Konvention, wie sie dem Fehlercode definiert werden als unsigned int ermöglichen.
OS / 360 und Nachfolger einen numerischen Exit-Code zu verwenden, in der Regel 0
das als Erfolg, 4
für Warnungen (wie ein Compiler, dass generierte Warnmeldung), 8
für Fehler und 12
für besonders schlechte Fehler
(Wie zum offenen SYSPRINT nicht in der Lage zu sein, die Standard-Ausgabeeinheit).
Normen Computersprache sagen, was ein Programm in der Sprache geschrieben zu tun hat, und was passieren wird. In diesem Fall sagen die C- und C ++ Standards, dass die Rückgabe 0 Signale Erfolg, unter anderem.
Sprach Implementierungen erlauben Programme auf bestimmte Implementierungen zu laufen. Es ist die Aufgabe der Implementierer, um herauszufinden, wie nach dem Standard-I / O-Arbeit zu machen, oder dem Betriebssystem des richtigen Ergebnis Code zu geben.
Was für ein Programm tut und was das O sieht nicht über die gleiche Sache sein. Alles, was notwendig ist, ist, dass das Programm funktioniert als der Standard auf dem gegebene O sagt.
Mit dem cstdlib
gerade endete ich mit zwei Linien:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
So EXIT_SUCCESS
gleich 0
und EXIT_FAILURE
gleich 1
, was bedeutet, es spielt keine Rolle, gedacht.
Checked auf Linux (OpenSuse) und mit der gleichen Sache endete.
Wenn Sie auch über dachten, warum der Fehlercode für den Erfolg ist 0 statt einen anderen Wert, ich möchte hinzufügen, dass es aus Performance-Gründen historisch gewesen sein könnte, als mit 0 verglichen sightly schneller gewesen (ich glaube, in der modernen Architekturen könnte die gleiche sein wie bei jeder Zahl) und in der Regel überprüfen Sie nicht für einen bestimmten Code-Fehler, nur wenn es Erfolg oder ein Fehler (so macht es Sinn, für das den schnellsten Vergleich zu verwenden).