C++ 程式終止
在 C++ 中,您可以透過下列方式結束程式:
exit
函式
在 stdlib.h > 中 < 宣告的函 exit
式會終止 C++ 程式。 提供做為 引數 exit
的值會當做程式的傳回碼或結束代碼傳回給作業系統。 依照慣例,傳回碼為零,表示程式順利完成。 您可以使用 stdlib.h > 中 < 定義的常數 EXIT_FAILURE
和 EXIT_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
語句一樣。 任何自動變數會終結。 然後, main
exit
使用傳回值作為參數叫用 。 請考慮下列範例:
// 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
時(或是在 語句之後 return
main
呼叫時),與目前線程相關聯的執行緒物件會終結。 接下來,靜態物件會以初始化的反向順序終結(在呼叫指定 atexit
給 的函式之後,如果有的話)。 下列範例將示範這類初始化和清除如何運作:
範例
在下列範例中,會先建立和初始化靜態物件 sd1
sd2
,再進入 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" );
}
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應