27

私は数週間独学で C プログラミングを学んでいますが、main()関数に関していくつか質問があります。

  1. すべての関数は、関数プロトタイプで宣言し、後で定義で宣言する必要があります。main()最初にプロトタイプで関数を宣言する必要がないのはなぜですか?

  2. int main()の代わりに使用する必要があるのはなぜvoid main()ですか?

  3. return 0 は関数で正確に何をしmain()ますか? たとえば、main()関数をで終了するプログラムを書いたらどうなるでしょうか?return 1;

4

9 に答える 9

24
  1. 関数の宣言は、関数を使用する前にのみ必要です。定義自体が宣言であるため、事前のプロトタイプは必要ありません。(一部のコンパイラやその他のツールは、事前のプロトタイプなしで関数が定義されている場合に警告する場合があります。これは、C 言語の規則ではなく、役立つガイドラインとして意図されています。)
  2. C標準がそう言っているからです。オペレーティング システムは、呼び出しプログラム (通常はシェル) に戻り値を渡します。一部のコンパイラは を受け入れますvoid mainが、これは非標準の拡張機能です (通常、「常に OS にゼロを返す」ことを意味します)。
  3. 慣例により、ゼロ以外の戻り値はエラーが発生したことを示します。シェル スクリプトやその他のプログラムは、これを使用して、プログラムが正常に終了したかどうかを確認できます。
于 2013-08-26T14:43:33.797 に答える
3

mainを呼び出すコードを記述していないため、 main の戻り値の型を自由に選択することはできません。main を呼び出すコードは、C の学習を考える前にすでに存在していました。これは、C ランタイム スタートアップ コードを提供する人々によって作成されました。通常、このコードは、知らないうちに実行可能ファイルに自動的にリンクされます。このコードは、多くの場合、crt0.o (crt0.c または crt0.s のアセンブラーから作成) というファイルに存在します。成功 (0) または失敗 (0 以外) を示す戻り値に加えて、シグナルによってコードが終了したかどうか、終了した場合はどれかなどのその他の情報を使用することを想定しています。これらは Unix の歴史の一部であり、ここでは繰り返さない :-)

于 2013-08-26T15:03:47.233 に答える
0

簡単に言えば、すべての質問の最も重要な点は、伝統と適合性です。ツールチェーン、オペレーティング システムなどは、main() と呼ばれるこのプロシージャが最初にユーザー コード空間 (プログラム) から呼び出される必要があることを認識しています...

具体的には:1)私が言ったように適合性のため。ツールチェーンとオペレーティング システムは既に main を認識しているため、宣言する必要はありません。また、exit() のような他の適合関数もあります。

2)メインがしばらく戻ったとき、オペレーティングシステムはそこから結果を返すことができます。通常、ゼロ以外はエラーを意味します。そのため、スクリプトや main() 関数などのプログラムを呼び出す他のプログラムを使用している場合、それが成功したかどうかを確認できます。

3) ゼロ以外の値を返すと、エラーを意味します。しかし実際には、その値を好きなように解釈できます。しかし、私が言ったように、OSは結果を持つことができます。

追加情報: main() は実際には、プログラムの開始時に呼び出される最初の関数 (作成した関数) ではありません。しかし、実際には、オペレーティングシステムとツールチェーンは、メインの前の他の呼び出し、環境のセットアップ、初期化などを容易にします。しかし、コードを書いているときにそれについて直接知っているわけではなく、それに対処したり考えたりする必要はまったくありません。組み込みシステムでは、通常、CPU のメイン クロック、割り込み、スタックなどをセットアップするために呼び出される非常に低レベルの関数がいくつかあります。

これが役に立ったことを願っています:)

于 2013-08-26T15:11:01.987 に答える