名前空間
変種
操作

main 関数

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定(C++20未満)
noexcept 指定子(C++11)
例外
名前空間
指定子
decltype(C++11)
auto(C++11)
alignas(C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr(C++11)
ユーザ定義(C++11)
ユーティリティ
属性(C++11)
typedef 宣言
型エイリアス宣言(C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

プログラムは main という名前のグローバルな関数を含まなければなりません。 これはプログラムの指定された開始点であり、以下のいずれかの形式を持たなければなりません。

intmain(){body} (1)
intmain(intargc,char*argv[]){body} (2)
/* 戻り値が int の、その他の処理系定義の形式 */ (3)
argc - 実行環境からプログラムに渡された引数の数を表す非負の値。
argv - argc +1 個のポインタの配列の最初の要素を指すポインタ。 その最後の要素はヌルであり、それより前の要素 (もしあれば) は実行環境からプログラムに渡された引数を表すヌル終端マルチバイト文字列を指します。 argv[0] がヌルポインタでなければ (または、同等な argc >0 であれば)、それはプログラムを起動するために使用された名前を表す文字列、または空文字列を指します。
body - main 関数の本体。

名前 argc および argv は任意です。 引数の型の表現も同様です。 つまり int main(int ac, char** av) も同じく有効です。

main() の非常に一般的な処理系定義の形式は、 (argcargv に加えて) 実行環境変数を指すポインタの配列を指す char*[] 型の3つめの引数を持ちます。


[編集]説明

main 関数は、プログラムのスタートアップ時、静的記憶域期間を持つ非ローカルオブジェクトの初期化の後に、呼ばれます。 これはホスト環境で (つまりオペレーティングシステム上で) 実行されるプログラムへの指定されたエントリポイントです。 フリースタンディングプログラム (ブートローダ、 OS のカーネル、など) へのエントリポイントは処理系定義です。

2引数形式の main 関数の引数により、実行環境から任意のマルチバイト文字列 (一般的にコマンドライン引数と言います) を受け取ることが可能となります。 ポインタ argv[1] .. argv[argc-1] はそれらの文字列それぞれの最初の文字を指します。 argv[0] はそのプログラム自身を起動するために使用された名前を表すヌル終端マルチバイト文字列の最初の文字を指すポインタです (それが実行環境によってサポートされない場合は空文字列 "" です)。 文字列は変更可能です (ただし変更しても実行環境には伝え戻されません)。 これは、例えば、 std::strtok で使用することができます。 argv の指す配列のサイズは少なくとも argc+1 であり、最後の要素 argv[argc] はヌルポインタであることが保証されます。

main 関数にはいくつか特別な性質があります。

1) プログラム内のいかなる場所でも使用することができません。
a) 特に、再帰的に呼ぶことができません。
b) アドレスを取ることができません。
2) 事前定義できず、オーバーロードできません。 実質的に、グローバル名前空間内の名前 main は、 main 関数のために予約されています (グローバル以外の名前空間内では、クラス、名前空間、列挙、およびあらゆるエンティティを表すために使用できます。 ただし、いかなる名前空間内においても、「main」という名前の関数を C 言語リンケージで宣言することはできません(C++17以上))。
3) 削除されたものとして定義することや、 C 言語リンケージ(C++17以上)inlinestatic、または constexpr として宣言することはできません。
4) main 関数の本体は return 文を含む必要はありません。 制御が return 文に遭遇することなく main 関数の終わりに達した場合、その効果は return0; を実行するのと同じです。
5) return (または main の終わりに達することによる暗黙の return) の実行は、まず普通に関数を抜け (自動記憶域期間を持つオブジェクトを破棄します)、そしてその return の引数と同じ引数で std::exit を呼ぶのと同等です (std::exit は、その後、静的オブジェクトを破棄して、プログラムを終了します)。
6) main 関数の戻り値の型は推定できません (auto main(){...} は使用できません)。
(C++14以上)

[編集]ノート

main 関数が関数 try ブロックを用いて定義されていても、静的オブジェクト (暗黙の std::exit によって破棄される) のデストラクタによって投げられる例外はキャッチされません。

OS のコマンドライン引数によって与えられた引数が argv によって参照されるマルチバイト文字配列に変換される方法には処理系定義の処理が含まれることがあります。

[編集]関連項目

close