名前空間
変種
操作

main関数

From cppreference.com
< c‎ | language

ホスト環境で実行されるようにコーディングされたすべてのCプログラムには、mainという名前の関数の定義(プロトタイプではない)が含まれます。これはプログラムの指定された開始点です。

int main (void) { 本体 } (1)
int main (int argc, char *argv[]) { 本体 } (2)
/* その他の処理系定義のシグネチャ */ (C99以降) (3)

目次

[編集] 引数

argc - プログラムが実行される環境からプログラムに渡された引数の数を表す非負の値。
argv - ホスト環境からプログラムに渡された引数を表す文字列を指すポインタの配列の最初の要素へのポインタ。argc + 1 個のポインタからなり、最後のポインタはヌルポインタです。もし argv[0] がヌルポインタでなければ(または、等価的に argc > 0 であれば)、プログラム名を表す文字列を指します。プログラム名がホスト環境から利用できない場合は、この文字列は空になります。

argcargv という名前は "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関数にはいくつかの特別な性質があります

1) この関数のプロトタイプをプログラムが提供することはできません。
2) main関数の戻り値の型が int互換性がある場合、mainの最初の呼び出しからのreturn(その後の再帰呼び出しからのreturnではない)は、main関数が返す値を引数として exit 関数を実行するのと等価です(これにより、atexit で登録された関数が呼び出され、すべてのストリームがフラッシュ・クローズされ、tmpfile で作成されたファイルが削除され、実行環境に制御が戻ります)。
3)

main関数が値を指定しないreturnを実行するか、あるいは同じことですが、returnを実行せずに終端の}に到達した場合、ホスト環境に返される終了ステータスは未定義です。

(C99まで)

main関数の戻り値の型が int互換性がない場合(例:void main(void))、ホスト環境に返される値は未規定です。戻り値の型が int と互換性があり、制御が終端の } に到達した場合、環境に返される値は return 0; を実行した場合と同じです。

(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)

[編集] 参照

  • C23標準 (ISO/IEC 9899:2024)
  • 5.1.2.2.1 プログラムの起動 (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 5.1.2.2.1 プログラムの起動 (p: 10-11)
  • C11標準 (ISO/IEC 9899:2011)
  • 5.1.2.2.1 プログラムの起動 (p: 13)
  • C99標準 (ISO/IEC 9899:1999)
  • 5.1.2.2.1 プログラムの起動 (p: 12)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 5.1.2.2 ホスト環境

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)