1

重複の可能性:
main() は C/C++ で何を返す必要がありますか?

私はCでこの簡単なプログラムを持っています:

#include <stdio.h>

int main()
{
  return 8;
}

戻り値の意味と表示方法、使い方は?

4

8 に答える 8

4

戻り値の意味は何ですか?

関数のステータスをmain()呼び出し元に返すために使用されmain()ます。

参照:
C++03 標準: 18.3 開始と終了

最後に、制御がホスト環境に戻されます。status が 0 または EXIT_SUCCESS の場合、成功した終了ステータスの実装定義形式が返されます。status が EXIT_FAILURE の場合、失敗した終了ステータスの実装定義形式が返されます。それ以外の場合、返されるステータスは実装定義です。

どのように表示するか、またはどのように使用しますか?

他の関数の戻り値を表示または使用するのと同じように。main()C/C++ の単なる別の関数であり、その点で main について特別なことは何もありません。

于 2012-11-03T04:32:49.147 に答える
3

UNIX ライクなシステムでは、結果コードは次のように表示できます。

$ ./myprogram
$ echo $?
8
$
于 2012-11-03T04:30:52.967 に答える
2

0またはEXIT_SUCCESS、実装で定義された「成功した終了」値を提供します。一部のシステムでは、これは必ずしも直接渡されませんでした。たとえば、VMS では、偶数の値は失敗を示し、奇数の値は成功を示します。そのためreturn 0;、プログラムでは実際にはゼロ以外の値 (私の記憶が正しければ 1) がシェルに返されます。

EXIT_FAILUREいくつかの実装で定義された「失敗した終了」値を提供します。

C および C++ の標準では、他に何も定義しようとはしていませんが、一般的なシステム (Windows、Linux など) では、少なくとも値の下位 8 ビットが、プログラムからの戻り値として環境に返されます。 .

これを別のプログラム (特にシェル) から使用して、これが成功したか失敗したか (また、失敗した場合は、どのように/なぜ失敗したか) を判断できます。このプログラムを生成し、戻り値を収集してから、他の数値と同様に出力することで表示できます。

#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <signal.h>

int main(int argc, char **argv) {
    int retval;

    signal(SIGINT, SIG_IGN);
    retval = spawnvp(P_WAIT, argv[1], argv+1);

    printf("%s returned: %d\n", argv[1], retval);
    return 0;
}
于 2012-11-03T04:32:46.260 に答える
1

return 0 は正常終了を意味します。return x with x != 0 は、「エラー」による終了を意味します。

于 2012-11-03T04:31:15.553 に答える
0

C および C++ 標準では、main戻り値の 2 つの可能な意味、つまりプロセスの成功とプロセスの失敗のみが定義されています。

標準に従って、を返すことで失敗の意味を呼び出し、 0 を返すか を返すことで成功EXIT_FAILUREの意味を呼び出すことができます。ここで、2 つの名前付き定数は で定義されたマクロ シンボルであり、たまたま と も宣言します。EXIT_SUCCESS<stdlib.h>exitabort

*nix と Windows の実際には、戻り値は直接プロセス終了コードになります。その主な使用法は、このプログラムの成功または失敗を条件として他のプログラムを実行することです。たとえば、Windows の [cmd.exe] の場合:

[D:\開発\テスト]
>まあまあ

[D:\開発\テスト]
> (rd blah 2>nul) && echo 厄介なディレクトリが削除されました || エコーおっと、ディレクトリを削除できません
厄介なディレクトリが削除されました

[D:\開発\テスト]
>エコー %errorlevel%
0

[D:\開発\テスト]
> (rd blah 2>nul) && echo 厄介なディレクトリが削除されました || エコーおっと、ディレクトリを削除できません
おっと、ディレクトリを削除できません

[D:\開発\テスト]
>エコー %errorlevel%
2

[D:\開発\テスト]
> _

*nix と Windows の両方で、C および C++ 標準で定義されている値以外の値を返すことができます。

ただし、Windows では、256 を少し上回る値 (正確な値を思い出すことはできません) が、プロセスが終了したかどうかをポーリングするためのステータス コードとして使用されます。 32 ビットのステータス コード。

于 2012-11-03T04:49:29.920 に答える
0

戻り値は、新しいプロセスをフォークしてプログラムを実行した親プロセスに送信されます。通常、親はシェルであるため何もしませんが、親プロセスがシェルでない場合、親プロセスは子の終了ステータスを知るために使用でき、それに応じて適切なアクションを実行できます。

于 2012-11-03T06:54:11.287 に答える
0

戻り値はランタイム終了時のメッセージです。0 はエラーがないことを意味し、その他の値はエラー コードです。

于 2012-11-03T04:33:04.420 に答える
0

戻り値は、プログラムが正常に終了したか失敗したかを CPU に伝えるだけです。0 は終了が成功したことを意味し、1 は終了が失敗したことを意味します。

EXIT_SUCCESS も 0 で、EXIT_FAILURE も 1 です。signal()関数と関数を使用して返すことができspawnvp()ます。

于 2012-11-03T04:39:18.530 に答える