通信用語の基礎知識 全国のICカードこれひとつ 戻る

main関数
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS)
読み:メインかんすう
外語:main function
品詞:名詞

CC++において、メインルーチンを記述する関数のこと。通常、最初に実行される(エントリーポイントとなる)関数。

目次
書式

int main(void)

int main(int argc, char *argv[])

int main(int argc, char *argv[], char *envp[])

概要

Cにはクラスの機能がない。このため、実行ファイルが実行され、まず呼び出される関数はmain()関数である。より具体的には、スタートアップルーチンと呼ばれる、アセンブリ言語などで書かれた初期化処理が起動し、ここからmainを呼び出している。

C++はクラスの機能があるが、言語仕様として、どのクラスにも属さないメソッドを許容しているため、やはり最初はCと同様にクラスに属さないmain()関数である。つまり、クラス外で定義されるグローバル関数である。

Cの場合はmain関数も通常の関数と同じ扱いであるため、再帰的に呼び出すことが出来る。C++では仕様で禁じられており、これは出来ない。

特徴
引数

仕様通りの実装であれば、引数は二つまたは三つが与えられる。

一つ目のargcは、プログラムが実行された際の引数の数である。

二つ目のargvは、その引数文字列の配列へのポインターである。

三つ目のargpは、環境変数の配列へのポインターである。但し、この引数は殆ど使用されていない。

引数文字列はargv[0]から、argv[argc-1]までが存在し、argv[argc]はNULLポインター(空ポインター)である。

そして、コマンドに引数が無い場合はargcは1であり、argv[0]は常にプログラムの名前が格納される。

返却値

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 */
返却値の確認

UNIX

シェルによって異なるが、概ね次のどちらかの方法で得られる。

% echo $? # sh系

% echo $status # csh系


DOS/Win

MS-DOSおよびMicrosoft Windowsでは、ERRORLEVEL環境変数に格納される。

echo %ERRORLEVEL%

バッチファイルでIF ERRORLEVELステートメントを用いれば、条件分岐も可能である。

雑学
WinMain

Microsoft WindowsのGUIプログラムの場合は、CやC++であっても、WinMain関数から開始される。Windowsアプリケーションでは、main関数を使用しなくてもよい。

内部の処理としては、WinMain関数に到達する前に、アセンブリ言語などで書かれたスタートアップルーチンが動作している。これはコンパイラーメーカーが作成したものがコンパイル時に自動的にリンクされるため、通常はプログラマーが書く必要はない。

処理系により異なるが、Visual C++の場合、このスタートアップルーチンが真っ先に呼び出すのはWinMainCRTStartup()という関数である。このような処理をランタイムライブラリといい、特にCの場合はCランタイム(CRT)という。

Visual C++のCランタイムであるWinMainCRTStartup()関数は、初期化を実施し、各種の初期化処理を終えてから、WinMain()を呼び出している。

mainの前

Visual C++の場合、Windows専用アプリケーションではなく通常のC/C++プログラムとしてコンパイルした場合、CランタイムのWinMainCRTStartup()からmainCRTStartup()という関数が呼ばれ、ここから更にmain()や、ワイド文字版の独自関数であるwmain()が呼び出されている。

さらに言えば、Visual C++の場合、内部的にはmainまたはwmainは_tmain、WinMainは_tWinMain、である。mainCRTStartupの前にもいくつかの処理があるが、いずれにせよ真っ先にmain()が呼ばれるわけではなく、ある種の準備段階が存在しているということである。

これはVisual C++に限ったことではなく、全ての処理系で共通である。例えば、組み込み系用のCコンパイラーの場合、使用されるハードウェアの仕様差に対応するため、リンクの際に別途アセンブリ言語で書かれたスタートアップルーチン(これはプログラマーが作らなければならない)のリンクが求められることが多い。

Unicode

Unicodeに対応するため、Visual C++は、コンソールプログラムの場合はwmain、Windowsプログラムの場合はwWinMainという関数を呼ぶことも可能である。

頭にwが無いものと引数の仕様はほぼ同じだが、引数の文字列のみがcharからwchar_t、つまりUnicodeのUTF-16になっている点に違いがある。

mainからWinMainを呼ぶ

その需要は定かではないが、mainからWinMainを呼ぶことも可能である。具体的には、次のようにする(Win32の場合)。

int main(void)

{

return WinMain(GetModuleHandle(NULL), NULL, NULL, SW_SHOWDEFAULT);

}

リンク
関連する用語
C
C++
mainメソッド
std::vector

[再検索] [戻る]


通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club
KisoDic