1. ホーム
  2. c++

[解決済み] C++でmainの適切な宣言は何ですか?

2022-03-04 07:56:32

質問

質問

  • の適切なシグネチャは何ですか? main 関数は、C++で使用できますか?

  • 正しい戻り値の型は何ですか、また、値を main ?

  • 使用できるパラメータの種類と、その意味を教えてください。

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

  • そのルールは時代とともに変化しているのでしょうか?

  • 違反するとどうなりますか?

解決方法は?

その main 関数は、グローバル名前空間において非メンバー関数として宣言されなければなりません。 つまり、クラスの静的または非静的メンバ関数にすることはできませんし、名前空間(無名名前空間でも)にも置くことはできません。

名前 main は、C++ではグローバル名前空間での関数として以外は予約されていません。 という名前の他の実体を自由に宣言することができます。 main これには、クラス、変数、列挙、メンバ関数、グローバル名前空間にない非メンバ関数などが含まれます。

という名前の関数を宣言することができます。 main をメンバー関数として、あるいは名前空間内で使用することができますが、そのような関数は main 関数は、プログラムの開始位置を指定します。

は、その main として宣言することはできません。 static または inline . また、オーバーロードすることはできません。 main をグローバル名前空間で使用します。

main 関数をプログラム内で使用することはできません。 main 関数のアドレスを取得することはできません。

の戻り値の型は main は、必ず int . これ以外の戻り値の型は許されません(このルールが太字になっているのは、以下のように宣言した不正なプログラムをよく見かけるからです。 main という戻り値の型を持つ void に関するルールで最もよく破られるのがこれでしょう。 main 関数)を使用することができます。

の宣言は2つあります。 main を許可しなければならない。

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

(1) は、パラメータがありません。

(2) には、2つのパラメータがあり、それらは慣習的に argcargv は、それぞれ argv は、プログラムの引数を表すC言語の文字列の配列へのポインタである。 argc には引数の数が入ります。 argv の配列になります。

通常は argv[0] にはプログラム名が含まれますが、必ずしもそうとは限りません。 argv[argc] はヌルポインタであることが保証されています。

なお、配列型の引数(例えば char*[] はポインタ型の引数を装っているだけなので、次の2つはどちらも有効な書き方です。 (2) で、どちらも全く同じ意味です。

int main(int argc, char* argv[])
int main(int argc, char** argv)

実装によっては、他の型や数のパラメータを許容するものもあります。何をサポートしているかは、実装のドキュメントを確認する必要があります。

main() は、成功を示す0を返し、失敗を示す0以外を返すことが期待されます。 を明示的に記述する必要はありません。 return ステートメントを main() を実行させると main() を明示的に指定せずに返します。 return と記述した場合と同じです。 return 0; . 次の2つの main() 関数も同じ動作をします。

int main() { }
int main() { return 0; }

マクロは2つあります。 EXIT_SUCCESSEXIT_FAILURE で定義されている <cstdlib> から返すこともできる。 main() で、それぞれ成功と失敗を示します。

が返す値は main() に渡されます。 exit() 関数で、プログラムを終了させる。

なお、これらはすべてホスト環境(非公式には、完全な標準ライブラリがあり、プログラムを実行するOSがある環境)用にコンパイルする場合にのみ適用されます。 独立した環境(例えば、ある種の組み込みシステム)用にC++プログラムをコンパイルすることも可能で、この場合、起動と終了は完全に実装で定義され main() 関数は必要ないかもしれません。 最近のデスクトップOS向けにC++を書くなら、ホスト環境向けにコンパイルすることになるのですが。