第28回
データ構造(7)~ポインタの配列とポインタのポインタ

main関数とコマンドライン・パラメータ

Cで記述したプログラムの出発点であるmain関数には、ユーザーがキーボードから入力したプログラムへの指示──コマンドライン・パラメータを渡すことができます。

main関数の記述方法

Cのプログラムがmain関数から始まることは、すでに紹介してきました。ここまで、サンプルのソースではmain関数の定義を以下のような記述で始めました。
int main(void)
{
      :

上の書き方では、main関数は『引数がなく、戻り値はint型』であることを示しています。しかし、これは省略した書き方です。main関数には、以下のようにして引数を与えることができます。
int main(int argc, char *argv[])
{
      :

コマンドライン・パラメータ

int型の戻り値が、そのプログラムを実行した親プロセス(一般にはシェル)に対する終了コードとなることはすでに説明しました。この値をどのように扱うか、あるいは無視するかは親プロセス次第です。

一方、argcとargvの仮引数名で示されている2つの引数は、親プロセスがプログラムが実行する際に、プログラム自身に渡されます。

通常はシェルからプログラムが実行されるため、それらはプロンプトに対してユーザーが入力した内容──コマンドライン・パラメータの各文字列となります。

パラメータは複数の文字列

シェルのコマンドラインでは、プログラム名に続けて処理対象のファイル名などをパラメータとして入力できます。例えば、テキストファイルから特定の単語を探してその行番号を返すプログラム“search”があったとします。

searchには検索対象のファイル名と検索したい単語を与えなければなりません。すると、コマンドラインの書式は以下のようになります。
search <ファイル名> <単語>

例えば“abc.txt”というファイルから“table”という語を含む行を探したいときには、シェルのプロンプトに対して以下のようなコマンドラインを入力することになります。
search abc.txt table

このように、コマンドラインにはプログラム名に続けて処理に必要な情報を、コマンドライン・パラメータという形で渡すことがよくあります。各パラメータ(上記の例の場合はファイル名と単語)は、1個以上のスペースまたはタブで区切ることになっています。

» ちょっとコラム : main関数の正しい定義

main関数は、本文で紹介したように
int main(int argc, char *argv[])
と定義するのが正当です。また、引数を省略して
int main(void)
としても構いません。

親プロセスに対して終了コードを返さない場合、main関数の戻り値を無視するという意味で
void main(void)
のような定義も可能です。しかし、多くのコンパイラではこのようなソースをコンパイルした場合に警告のメッセージが表示されます。main関数の戻り値としてint型の値が期待されているからです。

もちろん、警告を無視してコンパイルしたものを実行しても、大きな影響はありません。プログラムは問題なく実行されるでしょう。

しかし、警告が出るのは何だかすっきりしません。main関数の定義を
int main(void)
のようにして、main関数の最後で
return (0);
と、正常終了を意味する「0」を返すようにした方が無難です。