C++-Programmbeendigung

In C++ können Sie ein Programm auf die folgenden Arten beenden:

  • Rufen Sie die Funktion exit auf.
  • Rufen Sie die Funktion abort auf.
  • Führen Sie eine return -Anweisung aus main aus.

exit-Funktion

Die exit in < stdlib.h deklarierte Funktion > beendet ein C++-Programm. Der als Argument für angegebene Wert wird als Rückgabecode oder Exitcode des Programms an das exit Betriebssystem zurückgegeben. Gemäß der Konvention bedeutet ein Rückgabecode von Null, dass das Programm erfolgreich abgeschlossen wurde. Sie können die Konstanten EXIT_FAILURE und , die auch in EXIT_SUCCESS< stdlib.h definiert sind, verwenden, um den Erfolg oder Fehler > Des Programms anzugeben.

Das Ausstellen return einer Anweisung aus der Funktion entspricht dem Aufrufen der Funktion mit dem mainexit Rückgabewert als Argument.

abort-Funktion

Die abort Funktion, die auch in der Standard-Includedatei < stdlib.h deklariert > ist, beendet ein C++-Programm. Der Unterschied zwischen und ist, dass die exitabortexit C++-Laufzeitbeendigungsverarbeitung (globale Objektdetruktoren werden aufgerufen) ermöglicht, das Programm jedoch abort sofort beendet. Die abort Funktion umgeht den normalen Zerstörungsprozess für initialisierte globale statische Objekte. Außerdem wird jegliche spezielle Verarbeitung umgangen, die mit der atexit-Funktion angegeben wurde.

atexit-Funktion

Verwenden Sie die atexit -Funktion, um Aktionen anzugeben, die ausgeführt werden, bevor das Programm beendet wird. Keine globalen statischen Objekte, die vor dem Aufruf von initialisiert atexit wurden, werden vor der Ausführung der Exitverarbeitungsfunktion zerstört.

return -Anweisung in main

Das Ausstellen return einer main -Anweisung von entspricht funktional dem Aufrufen der exit Funktion. Betrachten Sie das folgende Beispiel:

// return_statement.cpp
#include <stdlib.h>
int main()
{
    exit( 3 );
    return 3;
}

Die exitreturn Anweisungen und im vorherigen Beispiel sind funktionell identisch. Normalerweise erfordert C++, dass Funktionen, die über andere Rückgabetypen als void verfügen, einen Wert zurückgeben. Die main Funktion ist eine Ausnahme. Sie kann ohne -Anweisung return enden. In diesem Fall wird ein implementierungsspezifischer Wert an den aufrufenden Prozess zurückgegeben. Mit return der -Anweisung können Sie einen Rückgabewert aus main angeben.

Zerstörung statischer Objekte

Wenn Sie eine -Anweisung von aufrufen oder ausführen, werden statische Objekte in umgekehrter Reihenfolge ihrer Initialisierung zerstört (nach dem Aufruf von , exitreturn sofern mainatexit vorhanden). Das folgende Beispiel zeigt, wie so eine Initialisierung und Bereinigung funktionieren.

Beispiel

Im folgenden Beispiel werden die statischen Objekte und vor dem Eintrag in erstellt sd1sd2 und main initialisiert. Nachdem dieses Programm mit der -Anweisung return beendet wurde, wird sd2 zuerst zerstört und dann sd1 . Der Destruktor für die Klasse ShowData schließt die Dateien, die diesen statischen Objekten zugeordnet sind.

// using_exit_or_return1.cpp
#include <stdio.h>
class ShowData {
public:
   // Constructor opens a file.
   ShowData( const char *szDev ) {
   errno_t err;
      err = fopen_s(&OutputDev, szDev, "w" );
   }

   // Destructor closes the file.
   ~ShowData() { fclose( OutputDev ); }

   // Disp function shows a string on the output device.
   void Disp( char *szData ) {
      fputs( szData, OutputDev );
   }
private:
   FILE *OutputDev;
};

//  Define a static object of type ShowData. The output device
//   selected is "CON" -- the standard output device.
ShowData sd1 = "CON";

//  Define another static object of type ShowData. The output
//   is directed to a file called "HELLO.DAT"
ShowData sd2 = "hello.dat";

int main() {
   sd1.Disp( "hello to default device\n" );
   sd2.Disp( "hello to file hello.dat\n" );
}

Eine andere Möglichkeit zum Schreiben des Codes besteht darin, die ShowData-Objekte mit dem Blockbereich zu deklarieren, sodass sie zerstört werden, wenn sie den Gültigkeitsbereich verlassen:

int main() {
   ShowData sd1( "CON" ), sd2( "hello.dat" );

   sd1.Disp( "hello to default device\n" );
   sd2.Disp( "hello to file hello.dat\n" );
}

Siehe auch

Funktions- und Befehlszeilenargumente