main 関数
プログラムは 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() の非常に一般的な処理系定義の形式は、 (argc
と argv
に加えて) 実行環境変数を指すポインタの配列を指す char*[]
型の3つめの引数を持ちます。
[編集]説明
main
関数は、プログラムのスタートアップ時、静的記憶域期間を持つ非ローカルオブジェクトの初期化の後に、呼ばれます。 これはホスト環境で (つまりオペレーティングシステム上で) 実行されるプログラムへの指定されたエントリポイントです。 フリースタンディングプログラム (ブートローダ、 OS のカーネル、など) へのエントリポイントは処理系定義です。
2引数形式の main 関数の引数により、実行環境から任意のマルチバイト文字列 (一般的にコマンドライン引数と言います) を受け取ることが可能となります。 ポインタ argv[1] .. argv[argc-1]
はそれらの文字列それぞれの最初の文字を指します。 argv[0]
はそのプログラム自身を起動するために使用された名前を表すヌル終端マルチバイト文字列の最初の文字を指すポインタです (それが実行環境によってサポートされない場合は空文字列 "" です)。 文字列は変更可能です (ただし変更しても実行環境には伝え戻されません)。 これは、例えば、 std::strtok で使用することができます。 argv
の指す配列のサイズは少なくとも argc+1
であり、最後の要素 argv[argc]
はヌルポインタであることが保証されます。
main
関数にはいくつか特別な性質があります。
main
は、 main 関数のために予約されています (グローバル以外の名前空間内では、クラス、名前空間、列挙、およびあらゆるエンティティを表すために使用できます。 ただし、いかなる名前空間内においても、「main」という名前の関数を C 言語リンケージで宣言することはできません(C++17以上))。main
関数の終わりに達した場合、その効果は return0; を実行するのと同じです。6) main 関数の戻り値の型は推定できません (auto main(){...} は使用できません)。 | (C++14以上) |
[編集]ノート
main 関数が関数 try ブロックを用いて定義されていても、静的オブジェクト (暗黙の std::exit によって破棄される) のデストラクタによって投げられる例外はキャッチされません。
OS のコマンドライン引数によって与えられた引数が argv
によって参照されるマルチバイト文字配列に変換される方法には処理系定義の処理が含まれることがあります。
[編集]関連項目
main 関数 の C言語リファレンス |