web-dev-qa-db-ja.com

EXIT_FAILURE vs exit(1)?

違いは何ですか?どちらが優先されますか、またはそれぞれをいつ使用する必要がありますか?

51

exit(1)(通常)は、正常に終了しなかったことを示します。ただし、その使用法は移植性がありません。たとえば、 OpenVMS では、exit(1)は実際に成功を示します。

失敗した終了を返すための標準値は_EXIT_FAILURE_のみですが、多くの実装では_1_が同じために使用されます。


要約すると:
完全に移植可能なコードの使用を記述したい場合は、

失敗の場合は_EXIT_FAILURE_。一方、
成功の場合は、exit(0)または_EXIT_SUCCESS_を使用できます。

_EXIT_SUCCESS_または_0_は両方とも同じであることに注意してください。


参照:

C99標準:7.20.4.3 exit関数
Para 5

最後に、制御がホスト環境に戻ります。ステータスの値がzeroまたは_EXIT_SUCCESS_の場合、ステータスが正常に終了した実装定義形式が返されます。ステータスの値が_EXIT_FAILURE_の場合、ステータスが実装に定義された形式の失敗した終了が返されます。それ以外の場合、返されるステータスは実装定義です。

55
Alok Save

本当に移植可能なコードの場合、EXIT_FAILUREが推奨されます。 C標準では、EXIT_FAILURE0、およびEXIT_SUCCESSの3つの値の意味のみを定義しています(0およびEXIT_SUCCESSは本質的に同義です)。

実用的な観点から、most典型的なシステムは他の値も受け入れます。メモリが提供される場合、Linuxは任意の8ビット値とWindowsの16ビット値を返します。 IBMメインフレーム、VMSなどへの移植を正直に気にしない限り、少なくとも8ビットの戻り値をサポートしないシステムのほとんどは気にしない可能性があります。

11
Jerry Coffin

つかいます EXIT_FAILURE。 OS全体で使用される定数です。その値は1以外の値である可能性があり、またコード内でより記述的です。

4
Ed Heal

特定のプログラムが返すステータス値の種類についての規則があります。最も一般的な規則は、成功の場合は単に0、失敗の場合は1です。比較を実行するプログラムは、異なる規則を使用します。不一致を示すためにステータス1を使用し、比較できないことを示すためにステータス2を使用します。既存の規則が意味をなす場合、プログラムは既存の規則に従う必要があります。

一部の非POSIXシステムでは、終了ステータス値に異なる規則が使用されます。 For greater portability、マクロを使用できますEXIT_SUCCESSおよびEXIT_FAILUREは、それぞれ成功と失敗の従来のステータス値です。それらはファイルstdlib.hで宣言されています。

1
Ravindra Bagale