Main function
プログラムはホスト環境においてプログラムの開始点として指定される、グローバル名前空間の関数 main を含まなければならない。この関数は以下のいずれかの形式をとること:
int
main() {
本体
}
|
(1) | ||||||||
int
main(
int
argc
,
char
*
argv
[]
) {
本体
}
|
(2) | ||||||||
int
main(
/* implementation-defined */
) {
本体
}
|
(3) | ||||||||
main
関数。
main
関数。
main
関数の実装定義型、戻り値型は
int
。
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
関数には以下のいくつかの特別な特性があります:
main
関数の本体には
return
文
を含める必要はありません:制御がreturn文に遭遇せずに
main
の終端に到達した場合、その効果は
return
0
;
を実行したものと同じです。
main
関数の終端への到達による暗黙的なreturn)は、まず関数を正常に抜けること(自動記憶域期間を持つオブジェクトを破棄し
、
main
関数の
事後条件アサーション
を評価する
(C++26以降)
)と等価であり、その後
std::exit
を
return
の引数と同じ引数で呼び出す(
std::exit
はその後静的オブジェクトを破棄しプログラムを終了する)。
main
関数にはいくつかの制限があります(これらに違反するとプログラムは不適格となります):
main
という名前は関数のために予約されている(ただし、クラス、名前空間、列挙型、および非グローバル名前空間内の任意のエンティティの名前として使用することは可能である。ただし、
main
という名前のエンティティをC
language linkage
でどの名前空間でも宣言することはできない)。
constexpr
(C++11以降)
、
consteval
(C++20以降)
、
inline
、または
static
を指定することはできません。
|
4)
main関数の戻り値型は推測できません(
auto
main
(
)
{
...
}
は許可されません)。
|
(C++14以降) |
| (C++20以降) |
注記
main
関数が
関数
try
ブロック
で定義されている場合、静的オブジェクトのデストラクタ(これらは暗黙の
std::exit
によって破棄される)によってスローされた例外は、これによって
捕捉されない
。
オペレーティングシステムのコマンドラインで与えられた引数が、 argv によって参照されるマルチバイト文字配列に変換される方法は、実装定義の処理を含む場合があります:
- C++コマンドライン引数の解析 MSDN
- シェル入門 POSIX
非常に一般的な実装定義の形式の 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++規格に対して遡及的に適用されました。
| 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
関数
|