157

質問

  • mainC ++での関数の適切なシグネチャは何ですか?

  • 正しい戻りタイプとは何ですか?また、から値を返すとはどういう意味mainですか?

  • 許可されるパラメータタイプとその意味は何ですか?

  • これはシステム固有ですか?

  • それらのルールは時間の経過とともに変更されましたか?

  • それらに違反するとどうなりますか?

4

5 に答える 5

201

main関数は、グローバル名前空間で非メンバー関数として宣言する必要があります。これは、クラスの静的または非静的メンバー関数にすることも、名前空間(名前のない名前空間であっても)に配置することもできないことを意味します。

この名前mainは、グローバル名前空間の関数を除いて、C++では予約されていません。main特に、クラス、変数、列挙、メンバー関数、およびグローバル名前空間にない非メンバー関数を含む、という名前の他のエンティティを自由に宣言できます。

メンバー関数または名前空間で名前を付けた関数を宣言できますが、そのような関数は、プログラムの開始場所を指定mainする関数ではありません。main

関数をまたはとして宣言することはmainできません。また、オーバーロードすることはできません。グローバル名前空間で指定できる関数は1つだけです。staticinlinemain

このmain関数はプログラムで使用できませんmain。コード内のどこからでも関数を呼び出すことはできません。また、そのアドレスを取得することもできません。

の戻りタイプはであるmain必要がありますintmain他の戻り型は許可されていません(戻り型が;で宣言する誤ったプログラムが見られることが非常に一般的であるため、この規則は太字で示されていvoidます。これはおそらく関数に関して最も頻繁に違反する規則mainです)。

main許可する必要がある宣言は2つあります。

int main()               // (1)
int main(int, char*[])   // (2)

1)にはパラメータはありません。

2)には、2つのパラメータがあり、それらは通常、それぞれとと呼ばれargcますargvargvプログラムへの引数を表す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_SUCCESSEXIT_FAILUREが定義されており、それぞれ<cstdlib>から戻ってmain()成功と失敗を示すことができます。

によって返された値は関数にmain()渡され、exit()関数はプログラムを終了します。

これはすべて、ホストされた環境(非公式には、完全な標準ライブラリがあり、プログラムを実行しているOSがある環境)用にコンパイルする場合にのみ適用されることに注意してください。自立型環境(たとえば、一部のタイプの組み込みシステム)用にC ++プログラムをコンパイルすることもできます。その場合、起動と終了は完全に実装定義であり、main()関数は必要ありません。ただし、最新のデスクトップOS用にC ++を作成している場合は、ホストされた環境用にコンパイルしています。

于 2010-11-17T17:19:25.380 に答える
15

標準ドキュメントから、3.6.1.2主な機能

戻り型はint型でなければなりませんが、それ以外の場合、その型は実装定義です。すべての実装では、次のmainの定義の両方を許可する必要があります。

int main() { / ... / }int main(int argc, char* argv[]) { / ... / }

後者の形式では、プログラムが実行されている環境からプログラムに渡される引数argcの数になります。argcがゼロ以外の場合、これらの引数はargv[0]からargv[argc-1]にイニシャルへのポインタとして提供されます。 nullで終了するマルチバイト文字列の文字....。

お役に立てば幸いです。

于 2010-11-18T05:21:18.127 に答える
3

int main()2つの有効なメインはとですint main(int, char*[])。それ以外のものはコンパイルされる場合とされない場合があります。mainが明示的に値を返さない場合、0暗黙的に返されます。

于 2010-11-17T17:49:03.543 に答える
3

最新の公開された標準(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)
于 2017-07-01T09:22:40.490 に答える
2

戻り値とその意味の詳細

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、の場合、実装で定義された形式のステータスの失敗した終了が返されます。それ以外の場合、返されるステータスは実装定義です。

于 2012-01-02T02:46:11.963 に答える