質問
main
C ++での関数の適切なシグネチャは何ですか?正しい戻りタイプとは何ですか?また、から値を返すとはどういう意味
main
ですか?許可されるパラメータタイプとその意味は何ですか?
これはシステム固有ですか?
それらのルールは時間の経過とともに変更されましたか?
それらに違反するとどうなりますか?
main
関数は、グローバル名前空間で非メンバー関数として宣言する必要があります。これは、クラスの静的または非静的メンバー関数にすることも、名前空間(名前のない名前空間であっても)に配置することもできないことを意味します。
この名前main
は、グローバル名前空間の関数を除いて、C++では予約されていません。main
特に、クラス、変数、列挙、メンバー関数、およびグローバル名前空間にない非メンバー関数を含む、という名前の他のエンティティを自由に宣言できます。
メンバー関数または名前空間で名前を付けた関数を宣言できますが、そのような関数は、プログラムの開始場所を指定main
する関数ではありません。main
関数をまたはとして宣言することはmain
できません。また、オーバーロードすることはできません。グローバル名前空間で指定できる関数は1つだけです。static
inline
main
このmain
関数はプログラムで使用できませんmain
。コード内のどこからでも関数を呼び出すことはできません。また、そのアドレスを取得することもできません。
の戻りタイプはであるmain
必要がありますint
。main
他の戻り型は許可されていません(戻り型が;で宣言する誤ったプログラムが見られることが非常に一般的であるため、この規則は太字で示されていvoid
ます。これはおそらく関数に関して最も頻繁に違反する規則main
です)。
main
許可する必要がある宣言は2つあります。
int main() // (1)
int main(int, char*[]) // (2)
(1)にはパラメータはありません。
(2)には、2つのパラメータがあり、それらは通常、それぞれとと呼ばれargc
ますargv
。 argv
プログラムへの引数を表すC文字列の配列へのポインタです。配列 argc
内の引数の数です。argv
通常、argv[0]
プログラムの名前が含まれていますが、常にそうであるとは限りません。 argv[argc]
nullポインタであることが保証されています。
配列型引数(のようなchar*[]
)は実際には偽装された単なるポインタ型引数であるため、次の2つは両方とも(2)を書くための有効な方法であり、どちらもまったく同じことを意味することに注意してください。
int main(int argc, char* argv[])
int main(int argc, char** argv)
一部の実装では、他のタイプおよび数のパラメーターが許可される場合があります。実装のドキュメントをチェックして、それが何をサポートしているかを確認する必要があります。
main()
成功を示す場合はゼロを返し、失敗を示す場合はゼロ以外を返すことが期待されます。return
明示的にステートメントを書く必要はありませんmain()
:main()
明示的なステートメントなしでreturnを許可return
した場合、それはあなたが書いた場合と同じですreturn 0;
。次の2つのmain()
関数の動作は同じです。
int main() { }
int main() { return 0; }
2つのマクロEXIT_SUCCESS
とEXIT_FAILURE
が定義されており、それぞれ<cstdlib>
から戻ってmain()
成功と失敗を示すことができます。
によって返された値は関数にmain()
渡され、exit()
関数はプログラムを終了します。
これはすべて、ホストされた環境(非公式には、完全な標準ライブラリがあり、プログラムを実行しているOSがある環境)用にコンパイルする場合にのみ適用されることに注意してください。自立型環境(たとえば、一部のタイプの組み込みシステム)用にC ++プログラムをコンパイルすることもできます。その場合、起動と終了は完全に実装定義であり、main()
関数は必要ありません。ただし、最新のデスクトップOS用にC ++を作成している場合は、ホストされた環境用にコンパイルしています。
標準ドキュメントから、3.6.1.2主な機能、
戻り型はint型でなければなりませんが、それ以外の場合、その型は実装定義です。すべての実装では、次のmainの定義の両方を許可する必要があります。
int main() { / ... / }
と
int main(int argc, char* argv[]) { / ... / }
後者の形式では、プログラムが実行されている環境からプログラムに渡される引数
argc
の数になります。argcがゼロ以外の場合、これらの引数はargv[0]からargv[argc-1]にイニシャルへのポインタとして提供されます。 nullで終了するマルチバイト文字列の文字....。
お役に立てば幸いです。
int main()
2つの有効なメインはとですint main(int, char*[])
。それ以外のものはコンパイルされる場合とされない場合があります。main
が明示的に値を返さない場合、0が暗黙的に返されます。
最新の公開された標準(C ++ 14)の正確な表現は次のとおりです。
実装は両方を許可するものとします
()
戻る関数int
との関数、戻りへの
(int
ポインタへのポインタchar)
int
のタイプとして
main
。
main
これにより、タイプがタイプint()
またはである限り、代替スペルが許可されることが明確になりint(int, char**)
ます。したがって、以下も許可されます。
int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
戻り値とその意味の詳細
3.6.1([basic.start.main]
)による:
のreturnステートメントに
main
は、main
関数を終了し(自動保存期間のあるオブジェクトを破棄し)std::exit
、引数として戻り値を使用して呼び出す効果があります。main
ステートメントに遭遇せずに制御が終了した場合return
、その効果は実行の効果です。return 0;
の動作についてstd::exit
は、セクション18.5([support.start.term]
)で詳しく説明し、ステータスコードについて説明します。
最後に、制御がホスト環境に戻されます。ステータスがゼロまたは
EXIT_SUCCESS
の場合、実装で定義された形式のステータス正常終了が返されます。statusがEXIT_FAILURE
、の場合、実装で定義された形式のステータスの失敗した終了が返されます。それ以外の場合、返されるステータスは実装定義です。