Namespaces
Variants

Main function

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

プログラムはホスト環境においてプログラムの開始点として指定される、グローバル名前空間の関数 main を含まなければならない。この関数は以下のいずれかの形式をとること:

int main() { 本体 } (1)
int main( int argc , char * argv [] ) { 本体 } (2)
int main( /* implementation-defined */ ) { 本体 } (3)
1) 環境提供の引数に依存せずに独立して実行される main 関数。
2) 環境から提供される引数を受け入れる main 関数。
argc および argv の名前は任意であり、パラメータの型の表現も同様です: int main ( int ac, char ** av ) も同様に有効です。
3) main 関数の実装定義型、戻り値型は int
C++標準では、実装定義の main 関数に対して、追加の(オプションの)パラメータを argv の後に配置することを推奨しています。
argc - プログラムが実行される環境からプログラムに渡される引数の数を表す非負の値。
argv - argc + 1 個のポインタからなる配列の最初の要素を指すポインタ。最後の要素はnullポインタであり、それ以前の要素(存在する場合)は、実行環境からプログラムに渡された引数を表す null終端マルチバイト文字列 を指す。 argv [ 0 ] がnullポインタでない場合(または同等に argc > 0 の場合)、これはプログラムの起動に使用された名前を表す文字列、または空文字列を指す。
body - main 関数の本体。

目次

説明

main 関数は、静的 storage duration を持つ非ローカルオブジェクトの initialization 後にプログラム起動時に呼び出されます。これは hosted 環境(つまりオペレーティングシステムを持つ環境)で実行されるプログラムの指定されたエントリーポイントです。 freestanding プログラム(ブートローダー、OSカーネルなど)のエントリーポイントは実装定義です。

2パラメータ形式の main 関数のパラメータは、実行環境から任意のマルチバイト文字列を渡すことを可能にします(これらは一般に コマンドライン引数 として知られています)。ポインタ [ argv [ 1 ] , argv [ argc - 1 ] ] は、これらの各文字列の先頭文字を指しています。 argv [ 0 ] (nullでない場合)は、プログラム自体を起動するために使用された名前を表すnull終端マルチバイト文字列の先頭文字へのポインタです(または、実行環境でこれがサポートされていない場合は空文字列 "" )。これらの文字列は変更可能ですが、これらの変更は実行環境に反映されません。例えば、 std::strtok と共に使用できます。 argv が指す配列のサイズは少なくとも argc + 1 であり、最後の要素 argv [ argc ] はnullポインタであることが保証されています。

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

1) main 関数の本体には return を含める必要はありません:制御がreturn文に遭遇せずに main の終端に到達した場合、その効果は return 0 ; を実行したものと同じです。
2) return文の実行(または main 関数の終端への到達による暗黙的なreturn)は、まず関数を正常に抜けること(自動記憶域期間を持つオブジェクトを破棄し main 関数の 事後条件アサーション を評価する (C++26以降) )と等価であり、その後 std::exit return の引数と同じ引数で呼び出す( std::exit はその後静的オブジェクトを破棄しプログラムを終了する)。

main 関数にはいくつかの制限があります(これらに違反するとプログラムは不適格となります):

1) プログラム内のどこでも 名前を付ける ことはできません
a) 特に、再帰的に呼び出すことはできません
b) そのアドレスを取得することはできない
c) これは typeid 式で使用できない または decltype 指定子で使用できない (C++11以降)
2) これは事前定義できず、オーバーロードもできない:事実上、グローバル名前空間における main という名前は関数のために予約されている(ただし、クラス、名前空間、列挙型、および非グローバル名前空間内の任意のエンティティの名前として使用することは可能である。ただし、 main という名前のエンティティをC language linkage でどの名前空間でも宣言することはできない)。
3) 削除定義することはできず、 任意の言語リンケージで宣言することはできません (C++11以降) constexpr (C++11以降) consteval (C++20以降) inline 、または static を指定することはできません。
4) main関数の戻り値型は推測できません( auto main ( ) { ... } は許可されません)。
(C++14以降)
5) main 関数は コルーチン にできません。
6) main 関数は名前付き モジュール に所属できません。
(C++20以降)

注記

main 関数が 関数 try ブロック で定義されている場合、静的オブジェクトのデストラクタ(これらは暗黙の std::exit によって破棄される)によってスローされた例外は、これによって 捕捉されない

オペレーティングシステムのコマンドラインで与えられた引数が、 argv によって参照されるマルチバイト文字配列に変換される方法は、実装定義の処理を含む場合があります:

非常に一般的な実装定義の形式の main ( ) は、( argc argv に加えて)型 char ** の第3引数を持ち、 実行環境変数へのポインタの配列 を指します。

プログラムに入力元と出力先を指定する方法を示します。
実行例: . / convert table_in. dat table_out. dat

#include <cstdlib>
#include <iomanip>
#include <iostream>
int main(int argc, char *argv[])
{
    std::cout << "argc == " << argc << '\n';
    for (int ndx{}; ndx != argc; ++ndx)
        std::cout << "argv[" << ndx << "] == " << std::quoted(argv[ndx]) << '\n';
    std::cout << "argv[" << argc << "] == "
              << static_cast<void*>(argv[argc]) << '\n';
    /* ... */
    return argc == 3 ? EXIT_SUCCESS : EXIT_FAILURE; // optional return value
}

出力例:

argc == 3
argv[0] == "./convert"
argv[1] == "table_in.dat"
argv[2] == "table_out.dat"
argv[3] == 0

参考文献

拡張コンテンツ
  • C++23標準 (ISO/IEC 14882:2024):
  • 6.9.3.1 main関数 [basic.start.main]

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 1003 C++98 main 関数のパラメータ名のサポートが過度に制限されていた すべての有効なパラメータ名が
サポートされる
CWG 1886 C++98 main 関数が言語リンケージ付きで宣言可能であった 禁止
CWG 2479 C++20 main 関数が consteval で宣言可能であった 禁止
CWG 2811 C++98 N3214 以降で main 関数が使用されるかどうかが不明確であった 名前が指定された場合は使用済みとみなされる

関連項目

Cドキュメント for main 関数