Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V jazyce C++ můžete program ukončit těmito způsoby:
Funkce exit
Funkce exit
deklarovaná v <stdlib.h> ukončí program C++. Hodnota zadaná jako argument je exit
vrácena do operačního systému jako návratový kód programu nebo ukončovací kód. Dle konvence návratový kód nula znamená, že byl program dokončen úspěšně. Konstanty EXIT_FAILURE
a EXIT_SUCCESS
také definované v <souboru stdlib.h> můžete použít k označení úspěchu nebo selhání programu.
Funkce abort
Funkce abort
, která je také deklarována ve standardním souboru <stdlib.h>, ukončí program C++. Rozdíl mezi exit
a abort
je, že exit
umožňuje zpracování ukončení modulu runtime C++ proběhnout (globální destruktory objektů se volaly). abort
program okamžitě ukončí. Funkce abort
obchází normální proces zničení inicializovaných globálních statických objektů. Také obchází všechna speciální zpracování zadaná pomocí funkce atexit
.
Specifické pro Společnost Microsoft: Z důvodů kompatibility systému Windows může implementace abort
knihovny DLL povolit spuštění kódu ukončení knihovny DLL za určitých okolností. Další informace najdete na webu abort
.
Funkce atexit
atexit
Pomocí funkce můžete určit akce, které se spouštějí před ukončením programu. Před spuštěním funkce pro ukončování zpracování nejsou inicializovány žádné globální statické objekty inicializované před voláním atexit
.
return
příkaz v main
Příkaz return
umožňuje zadat návratovou hodnotu z main
. Příkaz return
v main
první řadě funguje jako jakýkoli jiný return
příkaz. Všechny automatické proměnné jsou zničeny. main
Potom se jako parametr vyvolá exit
návratová hodnota. Představte si následující příklad:
// return_statement.cpp
#include <stdlib.h>
struct S
{
int value;
};
int main()
{
S s{ 3 };
exit( 3 );
// or
return 3;
}
Příkazy exit
a return
příkazy v předchozím příkladu mají podobné chování. Ukončete program i vrátí hodnotu 3 do operačního systému. Rozdíl je, že exit
nezničí automatickou proměnnou s
, zatímco příkaz return
dělá.
C++ obvykle vyžaduje, aby funkce, které mají jiné návratové typy, než void
vrátily hodnotu. Funkce je výjimkou. Může main
končit bez return
příkazu. V takovém případě vrátí hodnotu specifickou pro implementaci pro vyvolání procesu. (Ve výchozím nastavení vrátí MSVC hodnotu 0.)
Zničení vláken a statických objektů
Při volání exit
přímo (nebo když je volána po return
příkazu z main
), vlákna objekty přidružené k aktuálnímu vláknu jsou zničeny. Dále jsou statické objekty zničeny v obráceném pořadí jejich inicializace (po volání funkcí určených pro atexit
, pokud existuje). Následující příklad ukazuje, jak taková inicializace a vyčištění funguje.
Příklad
V následujícím příkladu jsou statické objekty a jsou vytvořeny a inicializovány sd1
před vstupem do main
.sd2
Po ukončení tohoto programu pomocí return
příkazu je nejprve sd2
zničen a poté sd1
. Destruktor třídy ShowData
zavře soubory přidružené k těmto statickým objektům.
// 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" );
}
Dalším způsobem, jak tento kód napsat, je deklarovat ShowData
objekty s oborem bloku, který je implicitně zničí, když přejdou mimo rozsah:
int main() {
ShowData sd1( "CON" ), sd2( "hello.dat" );
sd1.Disp( "hello to default device\n" );
sd2.Disp( "hello to file hello.dat\n" );
}