C 標準 (ISO/IEC 9899:2011) には次のように記載されています。
5.1.2.2.1 プログラムの起動
1 プログラムの起動時に呼び出される関数の名前はmain
. 実装は、この関数のプロトタイプを宣言していません。戻り値の型をint
パラメータなしで定義する必要があります。
int main(void) { /* ... */ }
または 2 つのパラメーター (ここではargc
andと呼ばれますargv
が、宣言されている関数に対してローカルであるため、任意の名前を使用できます):
int main(int argc, char *argv[]) { /* ... */ }
または同等のもの; 10)または他の実装定義の方法で。
10) したがって、int
として定義された typedef 名に置き換えることができます。またint
、argv の型を として記述することもできます
char **argv
。
したがって、唯一のポータブル宣言main()
の戻り値の型はint
です。MSVC がそれvoid
が許可されていると定義している場合 (「または他の実装定義の方法で」) は、それで問題ありませんが、コードが移植可能であるとは期待しないでください。Microsoft コンパイラの古いバージョン (MSVC 2005 まで) は許可しませんvoid main()
: 次のドキュメントを参照してくださいmain
: Program startupおよびThe main
Function and Program Execution . ただし、MSVC 2008 以降では許可するように文書化されていますvoid main()
: 参照main
: プログラムの起動。の 3 引数形式はmain()
、付録 J に共通の拡張として記載されています。
J.5 共通拡張
次の拡張機能は多くのシステムで広く使用されていますが、すべての実装に移植できるわけではありません。厳密に適合するプログラムを無効にする可能性のある拡張機能を含めると、実装が適合しなくなります。このような拡張機能の例としては、新しいキーワード、標準ヘッダーで宣言された追加のライブラリ関数、アンダースコアで始まらない名前を持つ定義済みマクロがあります。
J.5.1 環境引数
ホストされた環境では、main
関数は 3 番目の引数 を受け取ります。この引数はchar *envp[]
、 へのポインタの null で終わる配列を指しますchar
。各引数は、プログラムのこの実行の環境に関する情報を提供する文字列を指します (5.1.2.2.1 )。
から返された値はmain()
、実装定義の方法で「環境」に送信されます。
5.1.2.2.3 プログラムの終了
1 関数の戻り値の型が とmain
互換性のある型である場合、関数int
への最初の呼び出しからの戻りは、関数によって返された値を引数として関数main
を呼び出すことと同じです。11)関数を終了する
に到達すると、値 0 が返されます。戻り値の型が と互換性がない場合、ホスト環境に返される終了ステータスは規定されていません。exit
main
}
main
int
11) 6.2.4 に従って、自動保存期間が宣言されているオブジェクトの存続期間はmain
、前者の場合は終了しますが、後者の場合は終了しません。
0
「成功」として義務付けられていることに注意してください。EXIT_FAILURE
必要に応じてand EXIT_SUCCESS
fromを使用できます<stdlib.h>
が、0 は十分に確立されており、1 も同様です。255 より大きい終了コードも参照してください — 可能ですか? .
7.22.4.4exit
関数
¶5 最後に、制御がホスト環境に戻されます。の値status
が 0 またはの場合、正常終了EXIT_SUCCESS
ステータスの実装定義形式が返されます。の値が である場合、ステータスの失敗した終了の実装定義形式が返されます。それ以外の場合、返されるステータスは実装定義です。status
EXIT_FAILURE