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?

War es hilfreich?

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 der main Funktion entspricht die exit Funktion mit dem Wert Aufruf durch die main 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 von status Null oder   EXIT_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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top