Frage

Sollte ich exit() oder nur return Aussagen in main()? Persönlich favorisieren ich die return Aussagen, weil ich das Gefühl, es ist wie eine andere Funktion zu lesen und die Flusssteuerung, wenn ich den Code gerade lese ist glatt (meiner Meinung nach). Und selbst wenn ich die main() Funktion Refactoring will, return mit scheint wie eine bessere Wahl als exit().

Hat exit() etwas Besonderes zu tun, dass return nicht?

War es hilfreich?

Lösung

Eigentlich gibt is einen Unterschied, aber es ist subtil. Es hat mehr Auswirkungen auf C ++, aber die Unterschiede sind wichtig.

Als ich return in main() nennen, Destruktoren für meine lokal scoped Objekte aufgerufen werden. Wenn ich exit() nennen, wird kein destructor für meine lokal scoped Objekte aufgerufen werden! , dass Re-lesen. exit() nicht zurück . Das bedeutet, dass, sobald ich es nennen, gibt es „keine backsies.“ Alle Objekte, die Sie in dieser Funktion erstellt haben, werden nicht zerstört werden. Oft hat dies keine Auswirkungen, aber manchmal tut es, wie Schließen von Dateien (sicher wollen Sie alle Ihre Daten auf den Datenträger geleert?).

Beachten Sie, dass static Objekte bereinigt werden, auch wenn Sie exit() nennen. Schließlich ist zu beachten, dass, wenn Sie abort() verwenden, werden keine Objekte zerstört werden. Das heißt, keine globalen Objekte, keine statischen Objekte und keine lokalen Objekte haben ihre Destruktoren aufgerufen.

Gehen Sie mit Vorsicht bei Ausfahrt über Rückkehr begünstigen.

http://groups.google.com/group/gnu. gcc.help/msg/8348c50030cfd15a

Andere Tipps

Ein weiterer Unterschied: exit ist eine Standardbibliothek Funktion, so müssen Sie umfassen Kopf- und Verbindung mit dem Standard Bibliothek. Zu veranschaulichen (in C ++), dies ist ein gültiges Programm:

int main() { return 0; }

aber exit verwenden Sie benötigen ein gehören:

#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }

Plus dies fügt eine zusätzliche Annahme: dass exit von main ruft die gleichen Nebenwirkungen wie Rückkehr Null hat. Wie andere haben darauf hingewiesen, hängt dies ab, welche Art von ausführbaren Sie bauen (das heißt, die main ruft). Kodieren Sie eine App, die den C-Runtime verwendet? Eine Maya-Plugin? Ein Windows-Dienst? Ein Fahrer? Jeder Fall wird die Forschung benötigen, um zu sehen, ob exit entspricht return ist. IMHO mit exit, wenn Sie wirklich bedeuten return macht nur den Code verwirrend. OTOH, wenn Sie wirklich bedeuten exit, dann mit allen Mitteln zu verwenden.

Es ist zumindest ein Grund exit zu bevorzugen: Wenn einer Ihrer atexit Handler beziehen sich auf die automatische Speicherdauer von Daten in main, oder wenn Sie setvbuf oder setbuf verwendet, um eine der Standard zuweisen Ströme eine automatische-Storage- Dauer Puffer in main, dann von main Rückkehr erzeugt nicht definiertes Verhalten, aber Aufruf exit gültig ist.

Ein andere mögliche Nutzung (in der Regel für Spielzeug Programme reserviert, jedoch) ist aus einem Programm mit rekursiven Aufrufen von main zu beenden.

Ich verwende return immer, weil die Standard-Prototyp für main() sagt, dass es eine int zurückgibt.

Wie gesagt, einige Versionen der Standards geben main besondere Behandlung und davon ausgehen, dass es 0 zurückgibt, wenn es keine explizite return Aussage ist. In Anbetracht der folgenden Code:

int foo() {}
int main(int argc, char *argv[]) {}

G ++ erzeugt nur eine Warnung für foo() und ignoriert die fehlende Rückkehr aus main:

% g++ -Wall -c foo.cc
foo.cc: In function ‘int foo()’:
foo.cc:1: warning: control reaches end of non-void function

I STARK zweiten Kommentar von R. über Exit (), um die automatische Speicherung in main() zurückgewonnen zu vermeiden, bevor das Programm tatsächlich endet. Eine return X; Aussage in main() ist nicht genau das entspricht einem Aufruf von exit(X);, da die dynamische Lagerung von main() wenn main() kehrt verschwindet, aber es es nicht verschwindet, wenn ein Aufruf exit() stattdessen gemacht wird.

Darüber hinaus in C oder eine C-ähnlichen Sprache eine return Aussage deutet stark auf den Leser, dass die Ausführung in der aufrufenden Funktion fortsetzen wird, und während dieser Fortsetzung der Ausführung in der Regel technisch wahr ist, wenn Sie die C-Startroutine zählen, die genannt Ihre main() Funktion, es ist nicht genau das, was Sie bedeutet, wenn Sie den Prozess beenden bedeutet zu.

Nach allem, wenn Sie von Ihrem Programm beenden möchten innerhalb einer anderen Funktion außer main() Sie muss Anruf exit(). auch so konsequent in main() tun macht den Code viel besser lesbar, und es macht es auch viel einfacher für jedermann wieder Faktor Code; das heißt Code von main() auf eine anderen Funktion kopiert wird nicht wegen der zufälligen return Aussagen schlecht benehmen, dass sollte hat Anrufe wurde exit().

Also, all diese Punkte zusammen kombinieren ist die Schlussfolgerung, dass es eine Unsitte , zumindest für C, eine return Anweisung zu verwenden, um das Programm in main() zu beenden.

  

Ist exit () tut etwas Besonderes, dass 'Rückkehr' nicht?

Bei einigen Compilern für seltene Plattformen exit() könnte ihr Argument in Ihr Programm Exit-Wert übersetzen, während eine Rückkehr von main() nur den Wert direkt an die Host-Umgebung ohne Übersetzung passieren könnte.

Der Standard verlangt identisches Verhalten in diesen Fällen (genauer gesagt, es sagt etwas Rückkehr, die int-kompatibel aus main() ist sollte mit diesem Wert zu nennen exit() äquivalent). Das Problem ist, dass verschiedene Betriebssysteme unterschiedliche Konventionen haben die Austrittswerte zu interpretieren. Auf vielen (viele!) Systemen bedeutet 0 Erfolg und alles andere ist ein Fehler. Aber, sagen wir, VMS, bedeuten ungerade Werte Erfolg und auch solche, bedeuten Scheitern. Wenn Sie 0 von main() zurückgegeben würde ein VMS Benutzer eine unangenehme Nachricht über eine Zugriffsverletzung sehen. Es war nicht wirklich eine Zugriffsverletzung -. Das war einfach die Standard-Nachricht mit Fehlercode zugeordnet 0

Dann ANSI kam und gesegnet EXIT_SUCCESS und EXIT_FAILURE als Argument Sie exit() passieren könnten. Die Norm sagt auch, dass exit(0) identisch zu exit(EXIT_SUCCESS) verhalten sollte, so dass die meisten Implementierungen EXIT_SUCCESS definieren 0.

Der Standard, daher bringt Sie in einer Bindung auf VMS, da es keine Standardmethode hinterlässt eine Versagen zurück Code, der den Wert 0 haben passiert.

Der Anfang der 1990er Jahre Ära VAX / VMS-C-Compiler daher nicht den Rückgabewert von main() zu interpretieren hat, kehrte er einfach was Wert der Host-Umgebung. Aber wenn Sie exit() verwendet würde es tun, was die Norm gefordert: übersetzen EXIT_SUCCESS (oder 0) in einen Erfolgscode und EXIT_FAILURE in einen allgemeinen Fehlercode. So verwenden EXIT_SUCCESS Sie Had es passieren exit(), konnte man nicht zurückgeben von main(). Ich weiß nicht, ob modernere Versionen der Compiler, dass das Verhalten beibehalten.

Ein tragbares C-Programm verwendet, wie folgt aussehen:

#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 */
}

Neben: Wenn ich mich richtig erinnere, ist die VMS-Konvention für Exit-Wert nuancierter als gerade / ungerade. Es nutzt tatsächlich so etwas wie die niedrigen drei Bits eine Prioritätsstufe zu codieren. Im Allgemeinen sind jedoch die ungeraden Schweregrade angegeben Erfolg oder verschiedene Informationen und die geraden angegebenen Fehler.

In C von main Rückkehr ist genau die gleiche wie der Aufruf von exit mit dem gleichen Wert.

Abschnitt 5.1.2.2.3 des C Standard heißt es:

  

Wenn der Rückgabetyp der Hauptfunktion ist eine Art kompatibel mit int    eine Rückkehr aus dem ersten Aufruf der Hauptfunktion entspricht   Aufruf der Exit-Funktion mit dem Wert, der durch den Hauptzurück   Funktion als Argument ; 11) das Erreichen} Das beendet die   Hauptfunktion gibt einen Wert von 0. Wenn der Rückgabetyp ist   nicht mit int kompatibel, kehrte der Beendigungsstatus an den   Host-Umgebung ist nicht spezifiziert.

Die Regeln für C ++ ein bisschen anders sind als in anderen Antworten erwähnt.

Es ist eigentlich ein Unterschied zwischen exit(0) und return(0) in main - wenn Ihre main Funktion mehrmals aufgerufen wird,

.

Das folgende Programm

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
  if (argc == 0)
    return(0);
  printf("%d", main(argc - 1, argv));
}

Ausführen als

./program 0 0 0 0

Werde in folgenden Ausgabe:

00000

Doch diese:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
  if (argc == 0)
    exit(0);
  printf("%d", main(argc - 1, argv));
}

Wird nicht alles unabhängig von den Argumenten drucken.

Wenn Sie sicher sind, dass niemand jemals Ihre main nennt explizit es technisch nicht ein großer Unterschied im Allgemeinen, aber klaren Code exit halten würde viel besser aussehen. Wenn Sie aus irgendeinem Grund main nennen wollen -. Sie sollten es an Ihre Bedürfnisse anpassen

Sprechen über C.

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