int main()
とint main(void)
の違いを誰かに教えてもらえますか?なぜ両方が機能するのか、int main()
のデフォルトの引数は何ですか?
通常の状況では違いはありません。引数がないため、これは「main()のデフォルト引数」ではありません。
これは異常な状況です。 mainへの独自の呼び出しを作成する場合、_()
_は任意のパラメーターを渡すことを許可しますが、_(void)
_は何も渡さないことを強制します。それでも、99.99999999%の場合は問題になりません。これは主に、プログラムを起動するためにランタイムによって呼び出されます。ランタイムは、_()
_または_(void)
_を書き込んだかどうかを知りません。
標準のint main(int argc, char **argv)
をコーディングすると、コマンドラインパラメータがそこに表示されます。
main()
を使用すると、任意の数のパラメーターでmainを呼び出すことができます。 main(void)
は、パラメーターなしでmainを呼び出すことを強制します。そう:
_main(foo, bar);
_
main()
では問題ありませんが、main(void)
では問題あり-コンパイラーがエラーを生成します。
ここで、プログラムのエントリポイントについて具体的に質問しても、実際には違いはありません。どちらの場合も、プログラムへの引数(argc、argv、envp)は使用できません。
実用的な観点からは、実際の違いはありません。 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();
f
がint
を返す関数であることを指定しますが、_nof
が予期する可能性のあるパラメーターの数またはタイプに関する情報を提供します(これは含まれています)主に古いコードとの互換性のために-かつて、これはCで関数を宣言するためのonlyの方法でした。 C++では、同じ宣言がf
をパラメーターを取らない関数として明示的に宣言しているため、1つ以上のパラメーターでf
を呼び出そうとしても、この関数を呼び出すことはできません(別のオーバーロードを呼び出すか、適切なオーバーロードが見つからない場合はエラー)。