まず、ここに示すように、ホストされたシステムと独立したシステムで許可されるものには違いがあります。
ホストされたシステムの場合、5.1.2.2.1 プログラムの起動が適用されます。
プログラムの起動時に呼び出される関数は main と呼ばれます。実装は、この関数のプロトタイプを宣言していません。これは、戻り値の型が int で、パラメーターなしで定義されます。
int main(void)
... (argv/argc などのスタイルに関するテキストが続きます)。
興味深いのは「パラメータなし」です。int main()
とint main (void)
は、どちらも関数宣言子であり、パラメーターを持たないため、現在は同等です。以下が適用されます (6.7.6.3 ):
10 リスト内の唯一の項目としてのタイプ void の名前のないパラメーターの特殊なケースは、関数にパラメーターがないことを指定します。
/--/
14 識別子リストは、関数のパラメータの識別子のみを宣言します。その関数の定義の一部である関数宣言子の空のリストは、関数にパラメーターがないことを指定します。その関数の定義の一部ではない関数宣言子の空のリストは、パラメーターの数または型に関する情報が提供されないことを指定します.145)
私を強調してください。太字のテキストは に適用されるものint main()
です。145) テキストの末尾にも注記があり、「「将来の言語の指示」(6.11.6) を参照してください」と書かれています。
6.11.6 関数宣言子
括弧が空の関数宣言子 (プロトタイプ形式のパラメーター型宣言子ではない) の使用は廃止予定の機能です。
そして、ここに違いがあります。関数宣言子でint main()
あることは、C 標準の次のバージョンで動作することが保証されていないため、上記の理由から不適切なスタイルです。これは、C11 で廃止予定の機能としてフラグが立てられています。
したがってint main (void)
、ホストされたシステムでは常に使用し、int main()
今のところ 2 つの形式が同等であっても決して使用しないでください。
C++ では、どちらの形式も完全に同等ですがint main()
、主観的で表面的な理由から好ましいスタイルがあります (Bjarne Stroustrup はそう言っています... これは、特定の方法で何かを行う理由を説明するためのおそらく非常に悪い理論的根拠です)。