main
C ++ での関数の適切なシグネチャは何ですか?正しい戻り値の型とは何main
ですか?から値を返すとはどういう意味ですか?許可されているパラメーターのタイプとは何ですか?それらの意味は何ですか?
これはシステム固有ですか?それらのルールは時間とともに変化しましたか?違反した場合はどうなりますか?
main
C ++ での関数の適切なシグネチャは何ですか?正しい戻り値の型とは何main
ですか?から値を返すとはどういう意味ですか?許可されているパラメーターのタイプとは何ですか?それらの意味は何ですか?
これはシステム固有ですか?それらのルールは時間とともに変化しましたか?違反した場合はどうなりますか?
回答:
main
この関数はグローバル名前空間内の非メンバ関数として宣言する必要があります。つまり、クラスの静的メンバー関数または非静的メンバー関数にすることも、名前空間(名前のない名前空間であっても)に配置することもできません。
この名前main
は、グローバル名前空間の関数として以外は、C ++では予約されていません。main
クラス、変数、列挙、メンバー関数、グローバル名前空間にない非メンバー関数など、他のエンティティを自由に宣言できます。
main
メンバー関数または名前空間で名前が付けられた関数を宣言できますが、そのような関数はmain
プログラムの開始場所を指定する関数ではありません。
main
この関数はとして宣言することはできませんstatic
かinline
。また、オーバーロードすることもできません。main
グローバル名前空間で指定できる関数は1つだけです。
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
ステートメントを明示的に記述する必要はありません。明示的なステートメントなしでreturn main()
を許可する場合は、記述した場合と同じです。次の2つの関数の動作は同じです。main()
return
return 0;
main()
int main() { }
int main() { return 0; }
そこ二つのマクロがあり、EXIT_SUCCESS
かつEXIT_FAILURE
、で定義されて<cstdlib>
からも返すことができるようmain()
、それぞれ、成功と失敗を示します。
によって返された値は関数にmain()
渡されexit()
、プログラムが終了します。
これはすべて、ホストされた環境(非公式には、完全な標準ライブラリがあり、プログラムを実行しているOSがある環境)でコンパイルする場合にのみ適用されることに注意してください。自立型環境(たとえば、一部のタイプの組み込みシステム)用にC ++プログラムをコンパイルすることもできます。その場合、起動と終了は完全に実装定義であり、main()
関数が不要な場合もあります。ただし、最新のデスクトップOS用のC ++を作成している場合は、ホスト環境向けにコンパイルしています。
Main
、非メンバー関数さえないため、静的メンバー関数である必要があります。C89でさえmain
戻る必要がありint
ます。私はその正確なルールを知っているK&R Cと十分に精通していないが、私はそれも必要と推測main
返すようにint
するのでmain
ノーリターン型が暗黙的=やや一般的で無いタイプではなかったとint
K&Rインチ
int
ですから。
void
戻り値の型を言語拡張として許可しています。これを許可しないコンパイラには、GCCとコモーが含まれます。
標準ドキュメントから、3.6.1.2メイン関数、
戻り型はint型ですが、それ以外の場合はその型は実装定義です。すべての実装は、以下のメインの定義の両方を許可するものとします。
int main() { / ... / }
そして
int main(int argc, char* argv[]) { / ... / }
後者の形式で
argc
は、プログラムが実行される環境からプログラムに渡される引数の数になります。argcがゼロ以外の場合、これらの引数は、初期値へのポインターとしてargv [0]からargv [argc-1]で提供されます。 nullで終了するマルチバイト文字列の文字 .....
お役に立てれば幸いです。
main
どうあるべきかについて特定の理由はありますint
か?
void
そのモデルを壊すことができます。「常に成功と見なす」という意味だったとしても、意味がありません。プロセスが実際に失敗したかどうかを言う方法がなかったので、本当に成功しましたか?いいえ、戻りint
ます。
最新の公開標準(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)
int main(void)
C ++では正しくない証拠として引用しようとしました。
2つの有効な電源があるint main()
とint main(int, char*[])
。それ以外のものはコンパイルされる場合とされない場合があります。場合はmain
、明示的に値を返さない、0が暗黙的に返されます。
main
が無効であると言及したときに、コードがコンパイルされないのを見たことはありません。mainの戻り型がintである必要がある特定の理由はありますか?
int
の戻り値の型としてを必要とする理由main
は、この値がプログラムの終了コードとしてシェルに渡され、をsh
期待するためint
です。
void
がすべて無音の場合。ではint
、からの戻りごとに特定の終了値を定義する必要がありますmain
。
戻り値とその意味の詳細
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
場合、実装が定義した形式のステータスが正常に終了しなかったことが返されます。それ以外の場合、返されるステータスは実装定義です。
main
と非常に密接に関連しているか、その複製です。