return ステートメントと main() の exit()

実際、ある 違いますが微妙です。 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 の再帰呼び出しでプログラムを終了することも考えられます (ただし、通常はおもちゃのプログラム用に予約されています)。 .