C++ 程式終止

在 C++ 中,您可以透過下列方式結束程式:

  • 呼叫 函式 exit
  • 呼叫 函式 abort
  • returnmain 執行 語句。

exit 函式

在 stdlib.h > 中 < 宣告的函 exit 式會終止 C++ 程式。 提供做為 引數 exit 的值會當做程式的傳回碼或結束代碼傳回給作業系統。 依照慣例,傳回碼為零,表示程式順利完成。 您可以使用 stdlib.h > 中 < 定義的常數 EXIT_FAILUREEXIT_SUCCESS ,來指出程式的成功或失敗。

abort 函式

abort 函式也會在標準 include 檔案 < stdlib.h > 中宣告,會終止 C++ 程式。 和 abort 之間的差異 exit 在於允許 exit 進行 C++ 執行時間終止處理(呼叫全域物件解構函式)。 abort 立即終止程式。 函 abort 式會略過初始化全域靜態物件的一般解構程式。 另外也會略過任何使用 atexit 函式指定的特殊處理。

Microsoft 特定 :基於 Windows 相容性的原因,的 Microsoft 實 abort 作可能會允許在某些情況下執行 DLL 終止程式碼。 如需詳細資訊,請參閱abort

atexit 函式

使用 函 atexit 式來指定在程式終止之前執行的動作。 在結束處理函式執行之前,不會終結呼叫 atexit 之前初始化的全域靜態物件。

return 中的 語句 main

return語句可讓您從 main 指定傳回值。 return第一個 中的 main 語句就像任何其他 return 語句一樣。 任何自動變數會終結。 然後, mainexit 使用傳回值作為參數叫用 。 請考慮下列範例:

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

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

exit上述範例中的 和 return 語句有類似的行為。 兩者都會終止程式,並將值傳回 3 至作業系統。 差異在於 exit 不會終結自動變數 s ,而 語句則 return 為 。

一般而言,C++ 需要傳回值以外的 void 傳回型別的函式。 函式 main 是例外狀況;它可以結束而不使用 return 語句。 在此情況下,它會將實作特定的值傳回叫用程式。 (根據預設,MSVC 會傳回 0。)

執行緒和靜態物件的解構

當您直接呼叫 exit 時(或是在 語句之後 returnmain 呼叫時),與目前線程相關聯的執行緒物件會終結。 接下來,靜態物件會以初始化的反向順序終結(在呼叫指定 atexit 給 的函式之後,如果有的話)。 下列範例將示範這類初始化和清除如何運作:

範例

在下列範例中,會先建立和初始化靜態物件 sd1sd2 ,再進入 main 。 此程式使用 return 語句終止之後,請先 sd2 終結 ,然後再 sd1 終結 。 ShowData 類別的解構函式會關閉與這些靜態物件相關聯的檔案

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

撰寫此程式碼的另一種方式是宣告 ShowData 具有區塊範圍的物件,這會在超出範圍時隱含終結這些物件:

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

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

另請參閱

main 函式和命令列引數