ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
Hello, ANOTHER world!

main 関数の形と戻り値

プログラムは OS から呼び出されます。歴史的な理由で、C言語のプログラムではコマンドラインから起動されることが想定されています。それで、 コマンドラインパラメータを受け取れるようになっています(お馴染みの argc と argv ですね)。また、 OS への戻り値を返さないといけないので、 main 関数の戻り値は int になります。したがって、main 関数のプロトタイプは基本的に次の2通りです。
タイプ A:
int main(void);

タイプ B:
int main( int argc, char *argv[] );

タイプ A は、パラメータが無いバージョンです。括弧の中の void は「パラメータはないよ」という意味です。括弧の中に何も書かずに int main(); とするのとは意味が違います(これだとパラメータが決まっていないという意味になってしまいます)。
タイプ B は、皆さんお馴染みのパラメータを取るバージョンです。argc にはコマンドラインで与えられたコマンド名とパラメータの合計数が入っています(これは簡単ですね)。では argv がどうなっているか、イメージがわきますか?これは文字列の配列なので、初心者は次のようになっていると考えるかもしれませんが、間違いです。
実際には、argv は文字列を指すポインタの配列です。それで、次のようになっています(これについてはもう少し説明が必要なので、次回のトピックで詳しくお話しします)。
今度は戻り値に注目しましょう。タイプ A、B とも int 型ですね。この値が、プログラムが終了したときに OS に返却されます。では、どんな値を返すようにすればいいでしょうか?実は、ANSI-C では次の2つの返却値が定義されています。
  • EXIT_SUCCESS ... 成功時の返却値
  • EXIT_FAILURE ... 失敗時の返却値

例えばプログラムの処理が成功した場合は main 関数の終了時に

return EXIT_SUCCESS;
と書けば良いのです。なお、これらの値はインクルードファイル "stdlib.h" の中に #define で定義されたマクロ定数です。そこで、
#include <stdlib.h>
としておく必要があります。例えば次のような感じです。
#include <stdlib.h>

int main(void)
{
    return EXIT_SUCCESS;
}
補足:
上記の2通りのプロトタイプは ANSI-C の規格で決められたものです。そしてこれら以外に拡張版のプロトタイプも実際には存在します。例えば一部の環境では環境変数の値を簡単に取り込むためのパラメータが追加されています。
なお、歴史的にコマンドラインが存在しない Mac では、基本的にパラメータも戻り値もありません(OS X は別です)。

("Hello, ANOTHER world!" は2001年11月から2002年11月にかけて作成されたコンテンツです。)