実際、ある 違いますが微妙です。 C++ にはより多くの影響がありますが、違いは重要です。
return
を呼び出すと main()
で 、ローカルにスコープされたオブジェクトに対してデストラクタが呼び出されます。 exit()
を呼び出すと 、ローカル スコープのオブジェクトに対して呼び出されるデストラクタはありません! それを読み直してください。 exit()
返さない .つまり、一度呼んだら「裏切りなし」ということです。その関数で作成したオブジェクトは破棄されません。多くの場合、これは何の影響もありませんが、ファイルを閉じる場合などに影響を与えることがあります (すべてのデータをディスクにフラッシュしたいですか?)。
static
に注意してください exit()
を呼び出しても、オブジェクトはクリーンアップされます .最後に、 abort()
を使用する場合に注意してください 、オブジェクトは破棄されません。つまり、グローバル オブジェクト、静的オブジェクト、ローカル オブジェクトのデストラクタは呼び出されません。
復帰よりも離脱を優先する場合は注意してください。
http://groups.google.com/group/gnu.gcc.help/msg/8348c50030cfd15a
もう 1 つの違い:exit
は標準ライブラリ関数であるため、ヘッダーを含めて標準ライブラリにリンクする必要があります。 (C++ で) 説明すると、これは有効なプログラムです:
int main() { return 0; }
ただし、exit
を使用するには インクルードが必要です:
#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }
さらに、これは追加の仮定を追加します:exit
を呼び出すこと main
から ゼロを返すのと同じ副作用があります。他の人が指摘しているように、これはビルドしている実行可能ファイルの種類 (つまり、誰が main
を呼び出しているか) によって異なります。 )。 C ランタイムを使用するアプリをコーディングしていますか? Mayaプラグイン? Windows サービスですか。ドライバー?各ケースは、exit
かどうかを確認するための調査が必要です。 return
と同等です . exit
を使用した私見 本当の意味で return
コードをより混乱させるだけです。 OTOH、もしあなたが本気で exit
、それならぜひ使ってください。
exit
を好む理由が少なくとも 1 つあります。 :atexit
のいずれかの場合 ハンドラは main
の自動保存期間データを参照します 、または setvbuf
を使用した場合 または setbuf
main
の自動保存期間バッファを標準ストリームの 1 つに割り当てる 、その後 main
から戻ります 未定義の動作を生成しますが、exit
を呼び出します
main
の再帰呼び出しでプログラムを終了することも考えられます (ただし、通常はおもちゃのプログラム用に予約されています)。 .