Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W języku C++możesz zamknąć program na następujące sposoby:
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" );
}