[解決済み] C++でmainの適切な宣言は何ですか?
質問
質問
-
の適切なシグネチャは何ですか?
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つのパラメータがあり、それらは慣習的に
argc
と
argv
は、それぞれ
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_SUCCESS
と
EXIT_FAILURE
で定義されている
<cstdlib>
から返すこともできる。
main()
で、それぞれ成功と失敗を示します。
が返す値は
main()
に渡されます。
exit()
関数で、プログラムを終了させる。
なお、これらはすべてホスト環境(非公式には、完全な標準ライブラリがあり、プログラムを実行するOSがある環境)用にコンパイルする場合にのみ適用されます。 独立した環境(例えば、ある種の組み込みシステム)用にC++プログラムをコンパイルすることも可能で、この場合、起動と終了は完全に実装で定義され
main()
関数は必要ないかもしれません。 最近のデスクトップOS向けにC++を書くなら、ホスト環境向けにコンパイルすることになるのですが。
関連
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】'cout'は型名ではない
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない