重複の可能性:
関数宣言のユース ケースの代替 C 構文
main()
古い C プログラムでは、この非常に異なる定義が見られます。(gccでコンパイルします)
main(argc, argv)
int argc;
char *argv[];
{
...
...
}
宣言されている変数の種類と、関数ブレースの開始前に宣言されているのはなぜですか?
重複の可能性:
関数宣言のユース ケースの代替 C 構文
main()
古い C プログラムでは、この非常に異なる定義が見られます。(gccでコンパイルします)
main(argc, argv)
int argc;
char *argv[];
{
...
...
}
宣言されている変数の種類と、関数ブレースの開始前に宣言されているのはなぜですか?
これは、C の関数定義の古いスタイルです。この非プロトタイプ スタイルは、C 標準では廃止されているとマークされており、使用しないでください。
また、戻り値の型を (暗黙的にint
) 省略することは、C では許可されなくなりました。
これは、K&Rスタイルの定義と呼ばれます。基本的には、パラメーターをリストし、それらを最終弁論ブラケットと開始中括弧の間に宣言するだけです。
これは、1989Cより前の古いKnRCスタイルです(非標準)。これは、関数に引数を渡す方法でした。他のすべての関数と同じように、main()だけでなく。
例えば:
void non_main(argx, argy)
int argx,argy;
{
/*do something here*/
}
これは、への引数のタイプを指定するための単なる代替方法ですmain
。とまったく同じmain(int argc, char *argv[])
です。これは、元のCコンパイラおよびK&Rブックで使用されている元のスタイルであるため、K&Rスタイルと呼ばれます。廃止されたと見なされます。C++とは互換性がありません。それについて警告するGCCオプションがあり-Wold-style-definition
ますが、それでもいくつかの古いコードで表示されます。
int
宣言されていない戻り値の型を持つ関数の場合と同様に、C仕様に従って暗黙的に戻ります(これとリンクされた質問の他の回答によると、これはC99で廃止されましたか?)。
これは古いスタイルの宣言で、Fortran から来ています。
main(argc, argv)
int argc;
char *argv[];
あなたが期待することを正確に伝えます - argc は でint
ありargv
、 の配列ですchar *
。