共用方式為


C++程序終止

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

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

exit函式

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

abort函式

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

Microsoft特定:基於 Windows 相容性考慮,的 abort Microsoft實作可能會允許在某些情況下執行 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 函式和命令行自變數