ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
C、C++において、メインルーチンを記述する関数のこと。通常、最初に実行される(エントリーポイントとなる)関数。
main()の返却値は、exit()の引数と同様でint型の数値である。どちらの場合も、値 & 0377、つまり下位8ビットを「そのプログラムの呼び出し元」に返す。
一般的には、その呼び出し元はシェルであり、この返却値はシェルの環境変数へと格納される。もって、シェルスクリプト(UNIXの場合)やバッチファイル(MS-DOSの場合)で、実行結果に応じた分岐処理が可能となる。
返却値は0〜255の範囲であれば何でも構わないが、UNIXやその影響下にある環境では、0で正常、非0で異常、である。C標準もこの通りであるが、VMSは異なる方法を採用していた。
また、C標準ではインクルードファイルstdlib.hで、「EXIT_SUCCESS」と「EXIT_FAILURE」というマクロ定数が定義されており、これらも使用すれば、0が正常ではない処理系に対しても移植性が高まる。
なお、BSDでは終了コードを標準化しようと試みており、sysexits.hにてマクロ定数を定義している。FreeBSD/NetBSD/OpenBSD及びその系統全てに加え、Linuxでもこのヘッダーが使われている。
sysexits.hのバージョン「8.1 (Berkeley) 6/2/93」によると、次の定数が定義される。
#define EX_OK 0 /* successful termination */ #define EX__BASE 64 /* base value for error messages */ #define EX_USAGE 64 /* command line usage error */ #define EX_DATAERR 65 /* data format error */ #define EX_NOINPUT 66 /* cannot open input */ #define EX_NOUSER 67 /* addressee unknown */ #define EX_NOHOST 68 /* host name unknown */ #define EX_UNAVAILABLE 69 /* service unavailable */ #define EX_SOFTWARE 70 /* internal software error */ #define EX_OSERR 71 /* system error (e.g., can't fork) */ #define EX_OSFILE 72 /* critical OS file missing */ #define EX_CANTCREAT 73 /* can't create (user) output file */ #define EX_IOERR 74 /* input/output error */ #define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ #define EX_PROTOCOL 76 /* remote error in protocol */ #define EX_NOPERM 77 /* permission denied */ #define EX_CONFIG 78 /* configuration error */ #define EX__MAX 78 /* maximum listed value */
シェルによって異なるが、概ね次のどちらかの方法で得られる。
% echo $? # sh系
% echo $status # csh系
MS-DOSおよびMicrosoft Windowsでは、ERRORLEVEL環境変数に格納される。
echo %ERRORLEVEL%
バッチファイルでIF ERRORLEVELステートメントを用いれば、条件分岐も可能である。
Microsoft WindowsのGUIプログラムの場合は、CやC++であっても、WinMain関数から開始される。Windowsアプリケーションでは、main関数を使用しなくてもよい。
内部の処理としては、WinMain関数に到達する前に、アセンブリ言語などで書かれたスタートアップルーチンが動作している。これはコンパイラーメーカーが作成したものがコンパイル時に自動的にリンクされるため、通常はプログラマーが書く必要はない。
処理系により異なるが、Visual C++の場合、このスタートアップルーチンが真っ先に呼び出すのはWinMainCRTStartup()という関数である。このような処理をランタイムライブラリといい、特にCの場合はCランタイム(CRT)という。
Visual C++のCランタイムであるWinMainCRTStartup()関数は、初期化を実施し、各種の初期化処理を終えてから、WinMain()を呼び出している。
Visual C++の場合、Windows専用アプリケーションではなく通常のC/C++プログラムとしてコンパイルした場合、CランタイムのWinMainCRTStartup()からmainCRTStartup()という関数が呼ばれ、ここから更にmain()や、ワイド文字版の独自関数であるwmain()が呼び出されている。
さらに言えば、Visual C++の場合、内部的にはmainまたはwmainは_tmain、WinMainは_tWinMain、である。mainCRTStartupの前にもいくつかの処理があるが、いずれにせよ真っ先にmain()が呼ばれるわけではなく、ある種の準備段階が存在しているということである。
これはVisual C++に限ったことではなく、全ての処理系で共通である。例えば、組み込み系用のCコンパイラーの場合、使用されるハードウェアの仕様差に対応するため、リンクの際に別途アセンブリ言語で書かれたスタートアップルーチン(これはプログラマーが作らなければならない)のリンクが求められることが多い。
その需要は定かではないが、mainからWinMainを呼ぶことも可能である。具体的には、次のようにする(Win32の場合)。
int main(void)
{
return WinMain(GetModuleHandle(NULL), NULL, NULL, SW_SHOWDEFAULT);
}
コメントなどを投稿するフォームは、日本語対応時のみ表示されます