Es ist eine einfache Frage, aber ich sehe immer wieder widersprüchliche Antworten: Sollte die Hauptroutine eines C ++ - Programms zurückkehren 0
oder EXIT_SUCCESS
?
#include <cstdlib>
int main(){return EXIT_SUCCESS;}
oder
int main(){return 0;}
Sind sie genau dasselbe? Sollte EXIT_SUCCESS
nur mit verwendet werden exit()
?
Ich dachte, es EXIT_SUCCESS
wäre eine bessere Option, da andere Software Null als Fehler betrachten möchte, aber ich habe auch gehört, dass 0
der Compiler bei einer Rückkehr ohnehin in der Lage ist, ihn auf einen anderen Wert zu ändern.
c++
c
return-value
main
Trevor Hickey
quelle
quelle
0
undEXIT_SUCCESS
wird beide als Erfolg interpretiert.Antworten:
EXIT_FAILURE
, entweder in einer return-Anweisung inmain
oder als Argument fürexit()
, ist die einzige tragbare Methode, um einen Fehler in einem C- oder C ++ - Programm anzuzeigen.exit(1)
kann beispielsweise tatsächlich eine erfolgreiche Beendigung auf VMS signalisieren.Wenn Sie verwenden,
EXIT_FAILURE
wenn Ihr Programm fehlschlägt, können Sie es auch verwenden,EXIT_SUCCESS
wenn es erfolgreich ist, nur aus Gründen der Symmetrie.Wenn das Programm jedoch niemals einen Fehler signalisiert, können Sie entweder
0
oder verwendenEXIT_SUCCESS
. Beide werden vom Standard garantiert, um einen erfolgreichen Abschluss zu signalisieren. (Es ist kaum möglich,EXIT_SUCCESS
dass ein anderer Wert als 0 vorliegt, aber er ist bei jeder Implementierung, von der ich je gehört habe, gleich 0.)Die Verwendung
0
hat den kleinen Vorteil, dass Sie sie nicht#include <stdlib.h>
in C oder#include <cstdlib>
C ++ benötigen (wenn Sie einereturn
Anweisung verwenden, anstatt sie aufzurufenexit()
) - aber für ein Programm von erheblicher Größe werden Sie stdlib direkt oder indirekt einschließen wie auch immer.In C, beginnend mit dem Standard von 1999, und in allen Versionen von C ++ ist das Erreichen des Endes ohnehin
main()
implizitreturn 0;
, sodass Sie möglicherweise weder explizit0
nochEXIT_SUCCESS
explizit verwenden müssen. (Aber zumindest in C halte ich einen explizitenreturn 0;
für einen besseren Stil.)(Jemand fragte nach OpenVMS. Ich habe es nicht in einer langen Zeit verwendet, aber wie ich ungeradee Statuswerte im Allgemeinen bezeichnet Erfolg erinnern , während sogar Werte Scheitern bezeichnen. Die C Implementierung abbildet
0
zu1
, so dassreturn 0;
zeigt die erfolgreiche Beendigung. Andere Werte sind unverändert weitergegeben , zeigt alsoreturn 1;
auch eine erfolgreiche Beendigung an.EXIT_FAILURE
hätte einen geraden Wert ungleich Null.)quelle
0
undEXIT_SUCCESS
es wird nicht garantiert, dass sie denselben Wert haben (das habe ich in meiner Antwort erwähnt), aber beide bedeuten eine erfolgreiche Beendigung.EXIT_SUCCESS
ist stilistisch besser, wenn Sie auch verwendenEXIT_FAILURE
, ist aberexit(0)
in Ordnung.Das ist egal. Beide sind gleich.
C ++ Standard Quotes:
quelle
EXIT_SUCCESS == 0
. Auf der anderen Seite gibt es keinen guten Grund dafür, es nicht zu sein.0 ist per Definition eine magische Zahl. EXIT_SUCCESS ist glücklicherweise fast überall gleich 0. Warum also nicht einfach 0 zurückgeben / beenden?
exit (EXIT_SUCCESS); ist reichlich klar in der Bedeutung.
Ausfahrt (0); Auf der anderen Seite ist in gewisser Weise nicht intuitiv. Jemand, der mit dem Verhalten der Shell nicht vertraut ist, könnte annehmen, dass 0 == false == schlecht ist, genau wie jede andere Verwendung von 0 in C. Aber nein - in diesem einen speziellen Fall ist 0 == Erfolg == gut. Für die meisten erfahrenen Entwickler wird dies kein Problem sein. Aber warum sollte man den neuen Mann ohne Grund stolpern?
tl; dr - Wenn es eine definierte Konstante für Ihre magische Zahl gibt, gibt es fast nie einen Grund, die Konstante überhaupt nicht zu verwenden. Es ist durchsuchbarer, oft klarer usw. und kostet Sie nichts.
quelle
fclose()
,setvbuf()
, ...), POSIX (listen()
,pthread_create()
,pipe()
, ...), und viele, viele andere Bibliotheken (zB OpenGL [glGetError()
], zlib [deflate()
/inflate()
/ ...] SDL [SDL_CreateWindowAndRenderer()
/ ...], und Mehr).Dies ist eine unendliche Geschichte, die die Grenzen (ein Mythos) der "Interoperabilität und Portabilität über alle" widerspiegelt.
Was das Programm zurückgeben sollte, um "Erfolg" anzuzeigen, sollte dadurch definiert werden, wer den Wert erhält (das Betriebssystem oder der Prozess, der das Programm aufgerufen hat), nicht durch eine Sprachspezifikation.
Aber Programmierer schreiben Code gerne auf "tragbare Weise" und erfinden daher ihr eigenes Modell für das Konzept des "Betriebssystems", das symbolische Werte definiert, die zurückgegeben werden sollen.
In einem Viele-zu-Viele-Szenario (in dem viele Sprachen dazu dienen, Programme auf viele Systeme zu schreiben) sollte nun die Entsprechung zwischen der Sprachkonvention für "Erfolg" und dem Betriebssystem (das niemand gewähren kann, immer gleich zu sein) erfolgen durch die spezifische Implementierung einer Bibliothek für eine bestimmte Zielplattform behandelt werden.
Leider war dieses Konzept zum Zeitpunkt der Bereitstellung der C-Sprache nicht so klar (hauptsächlich zum Schreiben des UNIX-Kernels), und Gigagramme von Büchern wurden mit den Worten "return 0 bedeutet Erfolg" geschrieben, da dies auf dem Betriebssystem unter zutraf diesmal mit einem C-Compiler.
Von da an wurde keine klare Standardisierung vorgenommen, wie eine solche Korrespondenz behandelt werden sollte. C und C ++ haben ihre eigene Definition von "Rückgabewerten", aber niemand gewährt eine ordnungsgemäße Betriebssystemübersetzung (oder besser: Keine Compiler-Dokumentation sagt etwas darüber aus). 0 bedeutet Erfolg, wenn dies für UNIX - LINUX und - aus unabhängigen Gründen - auch für Windows zutrifft, und dies deckt 90% der vorhandenen "Consumer-Computer" ab, die - in den meisten Fällen - den Rückgabewert ignorieren (so können wir) Diskutiere seit Jahrzehnten, aber niemand wird es jemals bemerken!)
Stellen Sie in diesem Szenario vor einer Entscheidung die folgenden Fragen: - Bin ich daran interessiert, meinem Anrufer etwas über meine bestehende Situation mitzuteilen? (Wenn ich nur immer 0 zurückgebe ... gibt es keinen Hinweis hinter dem Alles) - Hat mein Anrufer Konventionen bezüglich dieser Kommunikation? (Beachten Sie, dass ein einzelner Wert keine Konvention ist: Dies erlaubt keine Darstellung von Informationen.)
Wenn beide Antworten Nein sind, besteht die gute Lösung wahrscheinlich darin, die Hauptrückgabeanweisung überhaupt nicht zu schreiben. (Und lassen Sie den Compiler entscheiden, in Bezug auf das Ziel arbeitet).
Wenn keine Konvention vorhanden ist 0 = Erfolg, erfüllen Sie die meisten Situationen (und die Verwendung von Symbolen kann problematisch sein, wenn sie eine Konvention einführen).
Wenn Konventionen vorhanden sind, stellen Sie sicher, dass symbolische Konstanten verwendet werden, die mit ihnen kohärent sind (und stellen Sie die Kohärenz der Konventionen und nicht die Wertekohärenz zwischen den Plattformen sicher).
quelle
Sobald Sie anfangen, Code zu schreiben, der eine Vielzahl von Exit-Status zurückgeben kann, beginnen Sie
#define
, alle zu schreiben . In diesem FallEXIT_SUCCESS
ist es sinnvoll, keine " magische Zahl " zu sein. Dies macht Ihren Code besser lesbar, da jeder andere Exit-Code verwendet wirdEXIT_SOMETHING
. Wenn Sie einfach ein Programm schreiben, das zurückgegeben wird, wenn es fertigreturn 0
ist, gültig und wahrscheinlich sogar sauberer ist, weil es darauf hindeutet, dass es keine ausgefeilte Rückkehrcodestruktur gibt.quelle
Was Sie von einem Programm zurückgeben, ist nur eine Konvention.
Nein, ich kann mir keine Umstände vorstellen, unter denen "EXIT_SUCCESS" dies nicht tun würde "0" wäre.
Persönlich würde ich "0" empfehlen.
MEINER BESCHEIDENEN MEINUNG NACH...
quelle
0
ist falsch und viele Funktionen kehren0
bei einem Fehler zurück / tun nichts.Wenn Sie EXIT_SUCCESS verwenden, ist Ihr Code portabler.
http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/
quelle
EXIT_SUCCESS
beide eine erfolgreiche Beendigung bedeuten.Einige Compiler könnten Probleme damit verursachen - auf einem Mac C ++ - Compiler funktionierte EXIT_SUCCESS einwandfrei für mich, aber auf einem Linux C ++ - Complier musste ich cstdlib hinzufügen, damit es wusste, was EXIT_SUCCESS ist. Davon abgesehen sind sie ein und dasselbe.
quelle
EXIT_SUCCESS
ohne<stdlib.h>
oder gearbeitet wird<cstdlib>
, muss dies von einem anderen Header direkt oder indirekt definiert worden sein. In C ++ ist es üblich, dass Standardheader#include
andere Standardheader verwenden. Wenn dies fehlerfrei kompiliert wird,int main() { return EXIT_SUCCESS; }
ist Ihr Compiler wahrscheinlich fehlerhaft .