web-dev-qa-db-ja.com

C ++で `void main`ではなく、` int main`を使用する必要があるのはなぜですか?

C++でint mainではなくvoid mainを使用する必要があるのはなぜですか?

31
kasperasky

簡単に言えば、C++標準ではintを返すためにmain()が必要なためです。

おそらくご存知のとおり、main()関数からの戻り値は、ランタイムライブラリによってプロセスの終了コードとして使用されます。 UnixとWin32はどちらも、プロセスの終了後にプロセスから返される(小さい)整数の概念をサポートしています。 main()から値を返すことは、プログラマーがこの値を指定する1つの方法を提供します。

30
Greg Hewgill

ほとんどのオペレーティングシステムは、アプリケーションが成功したかどうかにかかわらず、ユーザーまたは呼び出しプロセスに報告します。これは、スクリプトがプログラムの結果に基づいて条件付きで分岐できる(if-thenの場合)場合に特に便利です。以下に沿ったもの:

// pseudo-code
screenscrape  http://mydatasource.com > results.txt
if errorlevel == 0 then
   processfile results.txt
else
   echo Screen Scraping Failed!
end if

この結果ステータスは、mainの戻り値を介して行われます。

一部のコンパイラではvoid mainが許可されていますが、一貫性と単純さのために、ANSI標準ではmainの単一のプロトタイプが必要です。

int main(int argc, char *argv[]);

Cでは、引数は呼び出し元によってクリーンアップされるため、mainの作成者は引数argc&argvの宣言または処理を無視できます。ただし、mainを呼び出すセットアップルーチンがintの戻り値を期待していて、その戻り値が見つからない場合、動作は未定義になる可能性があります。

簡潔な答え:

  • Mainの戻り値はスクリプトの作成に役立ちます。
  • Mainを呼び出すセットアップルーチンとクリーンアップルーチンを使用するには、一貫したインターフェイスが必要です。
16
abelenky

変更の主な理由

void main(){}

int main(){}

以降のリリースでは、実行中に通知エラーがプログラム中に発生したことを、それが実行されているオペレーティングシステムに通知しました

return 0;

0ではなく任意の数が返された場合にプログラムが正常に実行されたことを識別します。つまり、エラーコードメインによって返されました。 codeblock IDEで実行している場合、ビルドログでメインが0を返す場合は通常表示されます

Process terminated with status 0

それ以外の場合は、ステータスコードが赤で表示されます。これは、エラーが発生したことを意味します

6
Code Warrior

ウィキペディアから:

メイン関数から返された値はプロセスの終了ステータスになりますが、C標準では特定の意味をEXIT_SUCCESS(従来はゼロ)とEXIT_FAILUREの2つの値にしか割り当てていません。他の可能な戻り値の意味は実装定義です。

1
BBetances

Cと同様、プロセスがOSに終了コードを与えるため。

あなたはどちらかを使うことができます

int main (int argc, char ** argv)
{
  return (0);
}

または

int main (int argc, char ** argv)
{
  exit (0);
}

これは少なくともC89 IIRCにあります。

0
Keltia

Intは戻りコードなので、プログラムはOSに戻ることができます。

この値をクエリして、操作が成功したかどうかを確認できます。

これは、コマンドラインスクリプトを使用するときに非常に役立ちました。

0
Toon Krijthe

おそらく、main()メソッドからのステータスコードで完全に終了することが理にかなっているためです。 Javaでは、System.exit()を使用してこれをエミュレートする必要がありますが、それほど優雅ではありません。

0
Rahul

プログラムを実行して確認すると、正常に実行されるかどうかが確認されます。つまり、0を返した場合、それはtrueで正常に実行されたことを意味し、1を返した場合は正常に実行されません。このint値は、プログラムが正常に実行されたかどうかをOSに通知します

0
user2786956