と の違いを教えてもらえますint main()
かint main(void)
? なぜ両方が機能し、デフォルトの引数はint main()
何ですか?
3 に答える
通常の状況では違いはありません。これは、引数がまったくないため、'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
は提供しませf
ん (これは主に古いコードとの互換性のために含まれています。かつては、これがC で関数を宣言する唯一の方法でした)。C++ では、同じ宣言f
がパラメーターをとらない関数として明示的に宣言されているためf
、1 つ以上のパラメーターを使用して呼び出しを試みても、この関数を呼び出すことはできません (別のオーバーロードを呼び出すか、適切なオーバーロードが見つからない場合はエラーを生成する必要があります)。