C言語のプログラムでmain()関数を終了させるとき、return文やexit()関数を使っているのを見かける。つまり、次のようなコードだ。
int main(void) { ... return 0; } int main(void) { ... exit(0); }
これらはどちらを使うのが良いか、違いは何かはっきりしなかったので改めて調べてみました。
exit()関数について
exit()関数はプログラムを正常に終了させる。つまり、以下のような処理が正常に行われる。
- すべてのオープンされているストリームをクローズする。このときバッファリングされて書き込まれていないデータはフラッシュされる。
- tmpfile()関数で作成した一時ファイルは削除する。
- 引数として渡された整数を終了状態を示す整数としてホスト環境に返す。
int型を返すreturn文について
一方、main()関数内でのint型を返すreturn文もプログラムを正常に終了させ、int型をホスト環境に返す。これはint型を引数としてexit()関数を呼び出すのは等価である。なぜならC言語の仕様で等価であることを求められているからである。したがって、ストリームのクローズ処理など、先ほど記載したことはexit()と同様に行われる。
また、main()関数の最後の } まで到達して終了する場合は「return 0;」が記述されているのと同様の動作と考えてよい(少なくともC99以降は)。
結論
結論はexit()関数とmain()関数内でのint型を返すreturn文は同等である。したがって好きな方を使えば良い。どちらを使うにしろ、プログラムの中ではどちらかに統一した方が好ましい
しかし、関数の呼び出し先でプログラムを正常終了させるにはexit()関数を使うことになるだろう。またexit()関数には、atexit()関数を使って終了時に呼び出される関数を登録することもできる。プログラム終了時に独自の終了処理を追加したい場合には、やはりexit()関数を使うことになる。
最後にもう一つ。exit()関数の引数にはEXIT_SUCCESSまたはEXIT_FAILUEREが使える。これは<stdlib.h>でマクロとして定義されている。
参考サイト:
JPCERT CCの「ERR04-C. プログラムの適切な終了方法を選択する」は非常に参考になりました。
以上、最後までお読みいただきありがとうございます。