main 関数
ホスト実行環境内での実行用にコーディングされているすべての C のプログラムは、 main
という名前の関数の定義 (プロトタイプではない) を持ちます。 これはプログラムの指示された開始点です。
int main (void) { body }
|
(1) | ||||||||
int main ( int argc, char *argv[]) { body }
|
(2) | ||||||||
/* another implementation-defined signature */ (C99以上) | (3) | ||||||||
目次 |
[編集] 引数
argc | - | ホスト環境からプログラムに渡された引数の個数を表す非負の整数。 |
argv | - | argc + 1 個のポインタの配列の最初の要素を指すポインタ。 最後の1個のポインタはヌルであり、それ以外のポインタはホスト環境からプログラムに渡された引数を表す文字列を指します。 argv[0] がヌルでない場合、または argc > 0 である場合 (両者は同等です)、 argv[0] はプログラムの名前を表す文字列を指します。 プログラムの名前がホスト環境から取得できない場合は、これは空になります。 |
名前 argc
および argv
は argument count および argument vector の略です。 これらの名前および型の表記方法は任意です (例えば int main(int ac, char** av) でも有効です)。
処理系定義形式の main の一般的なものは int main(int argc, char *argv[], char *envp[]) であり、その char*[]
型の第3引数はホスト環境変数へのポインタの配列です。
[編集] 戻り値
return 文が使用された場合は、その戻り値が exit() の暗黙の呼び出し (詳細は後述) への引数として使用されます。 ゼロおよび EXIT_SUCCESS の値は成功終了を表し、 EXIT_FAILURE の値は失敗終了を表します。
[編集] 説明
main
関数はプログラムのスタートアップ時に、静的記憶域期間を持つすべてのオブジェクトを初期化した後、呼ばれます。 これは、ホスト環境 (つまりオペレーティングシステム) 内で実行されるプログラムへの、指示されたエントリポイントです。 フリースタンディングプログラム (ブートローダや OS のカーネルなど) へのエントリポイントの名前および型は処理系定義です。
2引数形式の main 関数の引数には、実行環境から任意のマルチバイト文字列を渡すことができます (一般的にはコマンドライン引数と言います)。 ポインタ argv[1]
〜argv[argc-1]
は、それらの文字列それぞれの最初の文字を指します。 argv[0]
はそのプログラム自身を起動するために使用された名前を表すヌル終端マルチバイト文字列の最初の文字へのポインタです (ホスト環境がこれをサポートしていない場合は、 argv[0][0] はゼロになることが保証されています)。
ホスト環境が大文字と小文字の両方を供給できない場合は、コマンドライン引数は小文字に変換されます。
これらの文字列は変更可能であり、行われたあらゆる変更はプログラム終了まで維持されますが、これらの変更はホスト環境には伝達し戻されません。 これらは、例えば strtok などで、使用することができます。
argv
の指す配列のサイズは少なくとも argc+1
であり、最後の要素 argv[argc]
はヌルポインタであることが保証されています。
main
にはいくつか特別な性質があります。
main 関数が値を指定せずに return を実行した場合、または return を実行せずに終わりの } に到達した場合 (両者は同等です)、ホスト環境に返される終了ステータスは未定義です。 |
(C99未満) |
main 関数の戻り値の型が int と互換でなければ (例えば void main(void) など)、ホスト環境に返される値は未規定です。 戻り値の型が int と互換であり、制御が終わりの } に達した場合、ホスト環境に返される値は return 0; を実行した場合と同じです。 |
(C99以上) |
[編集] 例
入力をどこから探して結果をどこへ出力するかをプログラムに伝える方法をデモンストレーションします。
./a.out indatafile outdatafile
のように起動します。
出力例:
argc = 3 argv[0] --> ./a.out argv[1] --> indatafile argv[2] --> outdatafile argv[argc] = (nil)