#include <stdlib.h>
void exit(int status);
$? / %ERRORLEVEL% 獲取)atexit() 註冊的函數#define EXIT_SUCCESS 0 // 正常終止
#define EXIT_FAILURE 1 // 異常終止
最佳實踐:使用宏而非魔術數字,提高可移植性與可讀性。
exit() vs return 核心區別| 特性 | exit() | return (在 main 中) |
|---|---|---|
| 作用範圍 | 終止整個進程 | 返回調用者(main 返回給啟動代碼) |
| 清理動作 | 完整清理(緩衝區、文件、atexit) | 同 exit(main 返回觸發相同清理) |
| 調用位置 | 任意函數、任意深度 | 僅在函數內部 |
| 返回值用途 | 進程退出碼 | main 的返回值即進程退出碼 |
main() 中 return n; 與 exit(n); 效果等價(C標準保證)return 只退出當前函數,exit() 直接結束程序_Exit()/_exit() (POSIX):**不執行清理**,直接進入內核終止進程main() 執行結束(遇到 } 或 return)時,運行時啟動代碼會自動調用 exit(),參數為 main 的返回值。因此:
int main() {
// 無 return 語句
} // C99 起隱含 return 0; 即 exit(0);
#include <stdio.h>
#include <stdlib.h>
void cleanup(void) {
puts("清理函數被調用 (atexit 註冊)");
}
int main(int argc, char *argv[]) {
atexit(cleanup); // 註冊退出時執行
if (argc < 2) {
fprintf(stderr, "用法: %s <數字>\n", argv[0]);
exit(EXIT_FAILURE); // 非 main 中異常退出
}
int n = atoi(argv[1]);
if (n < 0) {
exit(EXIT_FAILURE);
}
printf("正常處理: %d\n", n);
return EXIT_SUCCESS; // 等價 exit(EXIT_SUCCESS)
}
| 誤區 | 正確理解 |
|---|---|
exit() 返回值類型是 void | 不返回任何值給調用者,參數傳給 OS |
| 返回值 > 255 會被截斷 | POSIX 規定退出碼僅低 8 位有效(0-255) |
異常時用 exit(0) | 0 表示成功,異常必須用非零值 |
C++ 中 exit() 不調用析構函數 | 對象若在棧上,析構函數不會調用;靜態/全局對象會析構 |
exit() 是 C 語言程序受控終止的標準接口。理解其與 return 的區別、掌握 EXIT_SUCCESS/FAILURE 標準碼、善用 atexit() 註冊清理邏輯,是編寫健壯命令行工具與系統級程序的基礎。C++ 開發中優先使用異常機制或 RAII 管理資源,謹慎使用 exit() 避免繞過析構函數導致資源洩漏。