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 にはいくつか特別な性質があります。
int と互換であれば、 main の最初の呼び出しからの戻り (2度目以降の (再帰的な) 呼び出しからの戻りは含まれません) は、 main 関数が返した値を引数として渡して exit 関数を呼ぶことと同等です (これにより、 atexit で登録された関数が呼ばれ、すべてのストリームがフラッシュされて閉じられ、 tmpfile で作成されたファイルが削除され、制御が実行環境に戻されます)。|
main 関数が値を指定せずに |
(C99未満) |
|
main 関数の戻り値の型が |
(C99以上) |
例
入力をどこから探して結果をどこへ出力するかをプログラムに伝える方法をデモンストレーションします。
./a.out indatafile outdatafile のように起動します。
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("argc = %d\n", argc);
for(int ndx = 0; ndx != argc; ++ndx)
printf("argv[%d] --> %s\n", ndx,argv[ndx]);
printf("argv[argc] = %p\n", (void*)argv[argc]);
}
出力例:
argc = 3
argv[0] --> ./a.out
argv[1] --> indatafile
argv[2] --> outdatafile
argv[argc] = (nil)
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 5.1.2.2.1 Program startup (p: 13)
- C99 standard (ISO/IEC 9899:1999):
- 5.1.2.2.1 Program startup (p: 12)
- C89/C90 standard (ISO/IEC 9899:1990):
- 5.1.2.2 Hosted environment
関連項目
main 関数 の C++リファレンス
|