Sdílet prostřednictvím


Ukončení programu C++

V jazyce C++ můžete program ukončit těmito způsoby:

  • Volejte exit funkci.
  • Volejte abort funkci.
  • return Spusťte příkaz z main.

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

Viz také

main argumenty funkcí a příkazového řádku