主な戻り値の範囲について標準は何と言っていますか? 255までしか言えませんか?
なぜなら
int main(void){
return 256;
}
echo $? ; # out 0
標準は言いません。0
、EXIT_SUCCESS
およびEXIT_FAILURE
(ある種の)指定された意味を持ちます。それ以外は実装によって異なります。
現在、ほとんどのUnixベースのシステムは8ビットの戻り値のみをサポートしています。Windowsは(少なくとも)32ビットの戻り値をサポートしています。64ビットWindowsが64ビットの戻り値をサポートしているかどうかは確認していませんが、64ビットWindowsでも通常は32ビットintを使用しているため、疑わしいと思います。
他の人が述べているように、C & C++ 標準は、次のことを述べる以外に戻り値をまったく制限していません。
main()
int
(実装で定義されたサイズの) を返し、EXIT_SUCCESS
) は成功したリターンであり、成功EXIT_FAILURE
しなかったリターンです。main()
明示的に値を返さない a は、ゼロを返したかのように扱われることを指定します。
wait()
この場合、戻り値の解釈は、( 、waitpid()
、またはを呼び出すことによって) プロセスが完了するのを待機するプロセス次第waitid()
です。 wait()
およびwaitpid()
は古い POSIX 関数であり、待機中の親プロセスが戻り値の最下位 8 ビットのみを使用できるように指定します。POSIX:2008 標準waitid()
は、子プロセスの完全な終了ステータスにアクセスできる一般化された待機メソッドとして追加されました。
サブプロセスを分岐した後、親プロセスはwait*()
関数の 1 つを呼び出して、分岐したプロセスが完了するまでスリープ状態にします (たとえば、から戻るmain()
、呼び出しexit()
などabort()
)。wait()
およびwaitpid()
関数は、整数へのポインタを介してステータスを返します。WIFEXITED(status_val)
呼び出し元は、およびWEXITSTATUS(status_val)
マクロを使用して実際の終了ステータスを抽出します。後者は POSIX で定義されており、status 引数の下位 8 ビットを返す必要があります。このwaitid()
関数は、構造体へのポインターを使用してsiginfo_t
、プロセスのステータス情報を返します。ステータス情報で説明されているように、si_status
メンバーには完全なステータス値が含まれます。
基本的に、終了ステータスの値は見る人の目にあります。ANSI/ISO 仕様は制限のないものです。POSIXスイートには、プロセスが終了するのを待って終了ステータスを取得する方法が複数あります。POSIX は、終了ステータス値に関する独自の制約セットを持つspawn()
軽量バージョンとしても定義しています。exec()
シェルには、結果の値をさらに制限する習慣があります。GNU の bashは戻りステータスを 7 ビットに制限し、POSIX 準拠のシェルは終了ステータスの値を 8 ビットに制限します。FWIW、ほとんどの人は、戻り値を64 未満に制限することは安全だと思われることに同意します。
終了コードは、Unixライクなシステムでは0から255までの数字です。Linuxでは256に変更されていますが、何でも返すことができます。Linuxの戻りコードの詳細については、ここを参照してください。Windowsの終了コードについて簡単に説明しているトピックに関するウィキペディアの記事もあります。
C標準は、終了コード、つまり関数main
に関するドキュメントへのデリゲートの戻り値に関する段落に特定の制限を課していません。exit()
statusの値が0またはの
EXIT_SUCCESS
場合、実装で定義された形式のステータス正常終了が返されます。statusの値が、の場合EXIT_FAILURE
、実装で定義された形式のステータスの失敗した終了が返されます。それ以外の場合、返されるステータスは実装定義です。
EXIT_SUCCESS
/ガイドラインは別として、これはEXIT_FAILURE
基本的に「やりたいことを何でもする」という意味です。:)
あるコメントで述べたように、POSIXシステムでは、終了コードの下位8ビットのみが実際に考慮されるという事実は、システムコールの設計方法に由来する単なるUNIX主義wait
です(終了ステータスは、下位8ビットにパックする必要があります)。戻り値)であり、wait
C標準とは何の関係もありません。
exit
反例はWindowsで、 /に渡された値全体が考慮されます( 1return
より大きくない限り、ただし、より大きくなることはないと思います。多くのコードが破損します)。DWORD
int
DWORD
GetExitCodeProcess
この値を返すために予約されているパラメーターは。であるためDWORD *
。
Unixでは、waitシステムコールは、さまざまなタイプの子終了情報を含むビットフィールドとしてパックされたタイプintのステータス値を設定します。子が終了によって終了した場合(WIFEXITEDマクロによって決定されます。通常の代替手段は、キャッチされていないシグナルで終了したことです)、SUSは、状況値の下位8ビットに終了状況が含まれることを指定します。これは、wait.hのWEXITSTATUSマクロを使用して取得できます。そのため、Unixの終了ステータスは 、符号なし8ビット整数の範囲である0〜255の値に制限されます。
Unixライクなシステムは通常、成功にはゼロ、エラーにはゼロ以外の規則を使用します。さまざまなエラーコードの相対的な意味に関して、いくつかの規則が開発されました。たとえば、GNUは、上位ビットが設定されたコードを重大なエラーのために予約することを推奨しており、FreeBSDは、推奨される解釈の広範なセットを文書化しています。
C99標準では、0と1のみが定義されています。ただし、他の値を使用できます。
詳細については、終了ステータスwikiを参照してください。
タイプを返しint
ます。に格納できる任意の値を返すことができるはずですint
。の正確なサイズint
は実装に依存するため、正確な範囲を示すことはできません。
5.1.2.2.3プログラムの終了1メイン関数の戻り型がintと互換性のある型である場合、メイン関数への最初の呼び出しからの戻りは、メイン関数によって返された値をその値として終了関数を呼び出すことと同じです。口論; 10)メイン関数を終了する}に到達すると、値0が返されます。戻りタイプがintと互換性がない場合、ホスト環境に返される終了ステータスは指定されていません。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
つまり、何かを返す必要はありません。しかし、それは通常の定義が何であるかをそのすぐ上に強く述べています。それらが標準であることをほぼ暗示していますが、ジェイルフリーカードから抜け出すことができます。つまり、何でもかまいません。