Udostępnij za pośrednictwem


Kończenie działania programu C++

W języku C++możesz zamknąć program na następujące sposoby:

  • Wywołaj funkcję exit.
  • Wywołaj funkcję abort.
  • Wykonaj instrukcję return z pliku main.

Funkcja exit

Funkcja exit zadeklarowana w <pliku stdlib.h> kończy program C++. Wartość podana jako argument jest exit zwracana do systemu operacyjnego jako kod powrotny programu lub kod zakończenia. Zgodnie z konwencją kod zwrotny zero oznacza, że program zakończył się pomyślnie. Możesz użyć stałych EXIT_FAILURE i EXIT_SUCCESS, również zdefiniowanych w <pliku stdlib.h>, aby wskazać powodzenie lub niepowodzenie programu.

Funkcja abort

Funkcja abort , zadeklarowana również w standardzie include file <stdlib.h>, kończy program C++. Różnica między elementami exit i abort umożliwia exit wykonywanie przetwarzania kończenia czasu wykonywania języka C++ (wywoływane są globalne destruktory obiektów). abort natychmiast kończy program. Funkcja abort pomija normalny proces niszczenia dla zainicjowanych globalnych obiektów statycznych. Pomija również wszelkie specjalne przetwarzanie określone przy użyciu atexit funkcji .

Specyficzne dla firmy Microsoft: Ze względów zgodności systemu Windows implementacja abort firmy Microsoft może umożliwić uruchamianie kodu zakończenia biblioteki DLL w pewnych okolicznościach. Aby uzyskać więcej informacji, zobacz abort.

Funkcja atexit

atexit Użyj funkcji , aby określić akcje wykonywane przed zakończeniem programu. Nie zainicjowano globalnych obiektów statycznych przed zniszczeniem wywołania atexit przed wykonaniem funkcji przetwarzania zakończenia.

return instrukcja w main

Instrukcja return umożliwia określenie wartości zwracanej z main. Instrukcja w main pierwszej kolejności działa jak każda return inna return instrukcja. Wszystkie zmienne automatyczne są niszczone. main Następnie wywołuje exit wartość zwracaną jako parametr. Rozważmy następujący przykład:

// return_statement.cpp
#include <stdlib.h>
struct S 
{
    int value;
};
int main()
{
    S s{ 3 };

    exit( 3 );
    // or
    return 3;
}

Instrukcje exit i return w poprzednim przykładzie mają podobne zachowanie. Zarówno przerwanie programu, jak i zwrócenie wartości 3 do systemu operacyjnego. Różnica polega na tym, że exit nie niszczy zmiennej automatycznej s, podczas gdy return instrukcja to robi.

Zwykle język C++ wymaga, aby funkcje, które mają zwracane typy inne niż void zwracać wartość. Funkcja main jest wyjątkiem; może kończyć się bez instrukcji return . W takim przypadku zwraca wartość specyficzną dla implementacji do procesu wywoływania. (Domyślnie funkcja MSVC zwraca wartość 0).

Niszczenie wątków i obiektów statycznych

Po wywołaniu exit bezpośrednio (lub po wywołaniu instrukcji return z main), obiekty wątku skojarzone z bieżącym wątkiem zostaną zniszczone. Następnie obiekty statyczne są niszczone w odwrotnej kolejności ich inicjowania (po wywołaniach funkcji określonych do atexit, jeśli istnieją). W poniższym przykładzie pokazano, jak działa takie inicjowanie i oczyszczanie.

Przykład

W poniższym przykładzie obiekty statyczne sd1 i sd2 są tworzone i inicjowane przed wpisem do main. Po zakończeniu korzystania z instrukcji return program najpierw sd2 zostanie zniszczony, a następnie sd1. Destruktor klasy ShowData zamyka pliki skojarzone z tymi obiektami statycznymi.

// 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" );
}

Innym sposobem na napisanie tego kodu jest zadeklarowanie ShowData obiektów z zakresem bloku, które niejawnie niszczy je, gdy wyjdą poza zakres:

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

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

Zobacz też

main argumenty funkcji i wiersza polecenia