web-dev-qa-db-ja.com

Cでのmain(void)とmain()の違い

int main()int main(void)の違いを誰かに教えてもらえますか?なぜ両方が機能するのか、int main()のデフォルトの引数は何ですか?

27
Archit

通常の状況では違いはありません。引数がないため、これは「main()のデフォルト引数」ではありません。

これは異常な状況です。 mainへの独自の呼び出しを作成する場合、_()_は任意のパラメーターを渡すことを許可しますが、_(void)_は何も渡さないことを強制します。それでも、99.99999999%の場合は問題になりません。これは主に、プログラムを起動するためにランタイムによって呼び出されます。ランタイムは、_()_または_(void)_を書き込んだかどうかを知りません。

標準のint main(int argc, char **argv)をコーディングすると、コマンドラインパラメータがそこに表示されます。

12
bmargulies

main()を使用すると、任意の数のパラメーターでmainを呼び出すことができます。 main(void)は、パラメーターなしでmainを呼び出すことを強制します。そう:

_main(foo, bar);
_

main()では問題ありませんが、main(void)では問題あり-コンパイラーがエラーを生成します。

ここで、プログラムのエントリポイントについて具体的に質問しても、実際には違いはありません。どちらの場合も、プログラムへの引数(argc、argv、envp)は使用できません。

8
vanza

実用的な観点からは、実際の違いはありません。 int main(void)を使用すると、mainはパラメーターを受け取らないことを明示的に示しているため、パラメーターを呼び出すことはできません。 int main()を使用すると、いくつかのパラメーターを指定してmainを呼び出す可能性が残ります。

ただし、コードゴルフや意図的に難読化されたコードなどの奇妙な状況を除いて、とにかくmainを呼び出さないでください。これはプログラムのエントリポイントであるため、スタートアップコードによって自動的に呼び出されます。いずれにしても、起動コードはコマンドライン引数を渡すので、選択内容によって起動方法が変わることはありません。渡されるパラメーターを使用するか無視するかだけが変わります。

この規格では特に、パラメータの有無にかかわらずmainを定義することができます(§5.1.2.2.1/ 1):

プログラムの起動時に呼び出される関数の名前はmainです。実装は、この関数のプロトタイプを宣言していません。これは、戻り値の型がintで定義され、パラメーターはありません。

    int main(void) { /* ... */ }

または2つのパラメーター(ここではargcおよびargvと呼ばれますが、宣言されている関数に対してローカルであるため、どのような名前でも使用できます):

    int main(int argc, char *argv[]) { /* ... */ }

または同等のもの;

指定されたタグの外側にありますが、C++では状況が少し異なります。 Cでは、次のような関数宣言:

int f();

fintを返す関数であることを指定しますが、_nofが予期する可能性のあるパラメーターの数またはタイプに関する情報を提供します(これは含まれています)主に古いコードとの互換性のために-かつて、これはCで関数を宣言するためのonlyの方法でした。 C++では、同じ宣言がfをパラメーターを取らない関数として明示的に宣言しているため、1つ以上のパラメーターでfを呼び出そうとしても、この関数を呼び出すことはできません(別のオーバーロードを呼び出すか、適切なオーバーロードが見つからない場合はエラー)。

3
Jerry Coffin