Namespaces
Variants

Main function

From cppreference.net

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

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

目次

パラメータ

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

名前 argc argv は「引数の数(argument count)」と「引数ベクトル(argument vector)」を表し、伝統的に使用されていますが、パラメータには他の名前を選択することも、それらの型の異なるが同等の宣言も可能です: int main ( int ac, char ** av ) も同様に有効です。

一般的な実装定義のmain関数の形式として int main ( int argc, char * argv [ ] , char * envp [ ] ) があり、ここでは型 char ** の第三引数が追加され、 実行環境変数 へのポインタの配列 を指します。

戻り値

return文が使用される場合、戻り値は暗黙的な exit() 呼び出しの引数として使用されます(詳細は後述)。値0と EXIT_SUCCESS は正常終了を示し、値 EXIT_FAILURE は異常終了を示します。

説明

main 関数は、静的記憶域期間を持つすべてのオブジェクトが初期化された後、プログラム起動時に呼び出されます。これは ホスト環境 (つまり、オペレーティングシステムが存在する環境)で実行されるプログラムの指定されたエントリーポイントです。任意の フリースタンディング プログラム(ブートローダー、OSカーネルなど)のエントリーポイントの名前と型は実装定義です。

2パラメータ形式のmain関数のパラメータは、実行環境から任意のマルチバイト文字列を渡すことを可能にします(これらは一般に コマンドライン引数 として知られています)。ポインタ argv [ 1 ] .. argv [ argc - 1 ] は、これらの各文字列の先頭文字を指します。 argv [ 0 ] (nullでない場合)は、プログラム自体の起動に使用された名前を表すnull終端マルチバイト文字列の先頭文字へのポインタです(または、ホスト環境でこれがサポートされていない場合、 argv [ 0 ] [ 0 ] がゼロであることが保証されます)。

ホスト環境が大文字と小文字の両方を提供できない場合、コマンドライン引数は小文字に変換されます。

文字列は変更可能であり、プログラム終了まで変更内容は保持されますが、これらの変更はホスト環境に反映されません:例えば strtok と共に使用することができます。

argv が指す配列のサイズは少なくとも argc+1 であり、最後の要素 argv[argc] はnullポインタであることが保証されています。

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

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

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

(C99まで)

main関数の戻り値の型が 互換性 のない場合(例: 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: 未定)
  • 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 ホスト環境

関連項目

C++ ドキュメント for main function
翻訳のポイント: - 「C++ documentation」→「C++ ドキュメント」と翻訳 - ` `タグ内の「main」は翻訳せず保持 - 「function」は翻訳せず保持(C++用語のため) - HTMLタグ、属性、構造は完全に保持 - フォーマットとスペースは元のまま維持