ホームページ  >  記事  >  php教程  >  C言語のvoid main()について

C言語のvoid main()について

高洛峰
高洛峰オリジナル
2016-12-13 13:26:511293ブラウズ

多くの人、そして市販の一部の書籍でさえ void main() を使用していますが、これは実際には間違っています。 void main( ) は C/C++ では定義されていません。 C++ の父である Bjarne Stroustrup は、彼のホームページの FAQ で、 void main( ) { /* ... */ } の定義は C++ ではなく、これまでも C++ ではなく、C++ でさえなかったと明確に述べています。( void main ( ) は C++ や C には存在しませんでした)。 C および C++ 標準における main 関数の定義についてそれぞれ説明しましょう。

1. C言語のMain()

C89ではmain()が使えます。 Brian W. Kernighan と Dennis M. Ritchie による古典的な傑作 The C Programming Language 2e (「C Programming Language Second Edition」) では、main() が使用されています。ただし、最新の C99 標準では、次の 2 つの定義のみが正しいです:

int main(void)

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

(参考: ISO/IEC 9899: 1999 (E ) プログラミング言語? C 5.1.2.2.1 プログラム起動)

もちろん、小さな変更を加えることもできます。例: char *argv[] は char **argv として記述できます。argv と argc は他の変数名 (intval や charval など) に変更できますが、変数の命名規則に従う必要があります。

コマンドラインからパラメータを取得する必要がない場合は int main(void); を使用してください、それ以外の場合は int main(int argc, char *argv[]) を使用してください。

プログラムの呼び出し元(オペレーティングシステムなど)に戻り値を渡せるように、main関数の戻り値の型はintでなければなりません。

C99では、main関数の最後にreturn文がない場合、コンパイラは生成されたターゲットファイル(exeファイルなど)にプログラムが正常に終了したことを示すreturn 0;を自動的に追加するよう規定されている。ただし、必須ではありませんが、main 関数の最後に return ステートメントを追加することをお勧めします。 vc6 はターゲット ファイルに return 0 を追加しないことに注意してください。これは、vc6 が 1998 年の製品であるため、この機能がサポートされていないためと考えられます。これで、return ステートメントを追加することをお勧めする理由がわかりました。ただし、gcc3.2 (Linux 上の C コンパイラ) は、生成されたオブジェクト ファイルに return 0; を追加します。

2. C++のMain()

C++98では、次の2つの主要な関数定義メソッドが定義されています:

int main( )

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

参考:ISO /IEC 14882 (1998-9-01) プログラミング言語 C++ 3.6 起動と終了

int main() は C99 の int main(void) に相当します。 int main(int argc, char *argv[ ]) も C99 で定義されているものと同じです。同様に、main 関数の戻り値の型も int である必要があります。 main 関数の最後に return ステートメントがない場合、C++98 では、生成されたオブジェクト ファイルに return 0 を自動的に追加することが規定されています。同様に、vc6 はこの機能をサポートしていませんが、g++3.2 (Linux の C++ コンパイラ) はサポートしています。

3. void main() について

C および C++ では、パラメータを受け取らない、または情報を返さない関数のプロトタイプは「void foo(void);」です。おそらくこのため、プログラムが値を返す必要がない場合、main 関数は void main(void) として定義できると誤解している人が多くいます。しかし、これは間違いです! main関数の戻り値はCおよびC++の標準で規定されているint型として定義する必要があります。 void main は一部のコンパイラ (vc6 など) でコンパイルできますが、void main は標準で定義されていないため、すべてのコンパイラが void main をサポートしているわけではありません。 g++3.2 では、main 関数の戻り値が int 型でない場合、コンパイルはまったく通過しません。 gcc3.2 は警告を発行します。したがって、プログラムの移植性を高めたい場合は、必ず int main を使用してください。

「先生はそれが正しいことだと言いました」などという言葉で自分を言い訳しないでください。教師には間違っているという悪い癖があります。安全で標準に準拠したコードを作成することで、誰もがこの標準的なことに時間を浪費するのではなく、プログラム内の他の問題に集中できます。

システムによっては、プログラムが void main を使用して定義されている場合や戻り値がない場合、スタック例外が発生し、システム障害が発生する可能性があることに注意してください。 (詳しくは以下の英語部分をご覧ください)

4. 戻り値の関数

main関数の戻り値は、プログラムの終了ステータスを示すために使用されます。 0 が返された場合は、プログラムが正常に終了したことを意味しますが、返されたその他の数値の意味はシステムによって決定されます。通常、ゼロ以外の戻り値は、プログラムが異常終了したことを示します。 winxp 環境でちょっとした実験をしてみましょう。まず次のプログラムをコンパイルします:

int main(void)

次に、「echo %ERRORLEVEL%」と入力して Enter キーを押すと、プログラムの戻り値が 0 であることがわかります。コンパイルしたばかりのファイルが a.exe であると仮定します。「a && dir」と入力すると、現在のディレクトリ内のフォルダーとファイルがリストされます。ただし、これを「return -1」またはゼロ以外の別の値に変更し、再コンパイルして「a && dir」と入力すると、dir は実行されません。 && の意味は、&& より前のプログラムが正常に終了した場合、&& の後のプログラムは引き続き実行されますが、それ以外の場合は実行されません。つまり、プログラムの戻り値を利用して、次のプログラムを実行するかどうかを制御できます。これは int main の利点です。興味があれば、main 関数の戻り値の型を非 int 型 (float など) に変更し、「a && dir」を再コンパイルして実行して、何が起こるかを確認し、なぜそうなるのかを考えることもできます。ちなみに、 || と入力すると、異常終了した場合に dir が実行されることになります。


5. int main(int argc, char *argv[], char *envp[]) はどうですか?

もちろんこれは標準C/C++で定義されているものではありません! char *envp[] は、システム環境変数を取得するために一部のコンパイラが提供する拡張関数です。これは標準ではなく、すべてのコンパイラがサポートしているわけではないため、移植性が低く、プログラムが特定の環境で動作するように特別に設計されており、システムの環境変数を取得する必要がある場合を除き、推奨されません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。