コラム4.  main()関数の書式

main関数の引数と戻り値

このサイトでは、C言語のプログラムのmain()関数の記述の仕方として、以下のスタイルを

void main()

もしくは

int main()

という記述の仕方をしています。実は、この書式は、間違いではないのですが、本来のC言語のありかたを考えれば、あまり推奨できる記述方法とは言えません。

というのも、すでに述べたとおり、C言語は、そもそもunixというOSに使用する言語として開発されました。このOSが開発された当時、コンピュータのUIは、現在のウィンドウズやMacOSのような、GUIではなく、キーボードからの文字入力に対応した、CUIでした。

そのため、OSになんらかの支持を与える時の書式は、コマンドラインからの文字列の入力に依存するスタイルでした。また、unixというOSは、unixそのものもそうですが、unixで使用されるコマンドも、C言語で記述されています。そして、そのコマンドのほとんどが、そのあとに、「オプション」といものを付加することが可能でした。

コマンドラインのオプション

たとえば、代表的なunixのコマンドで、あるファイル内の情報を見る、「cat」と呼ばれるものがあります。そのコマンドは、通常、

cat hello.txt

のように、コマンドの後ろにファイル名を付加します。さらに、同じコマンドを、

cat -n hello.txt

のようにして使用すると、同じファイルが行番号をつけて表示されます。このように、unixのコマンドには、後ろに「いくつかのコマンドを付加する可能性がある」仕組みになっているのです。そのため、通常、unix上でC言語のプログラムを作成する際には、

コマンドラインオプションを取得できる基本の形
int main(int argc,char** args){
	 … 
	return 0;
}

という形で記述されるのが普通なのです。このmain()関数の引数の、argcは、付与されたオプションの数であり、その数だけ、文字列配列、argsが用意されるのです。具体的に説明すると、前述の「ls -n hello.txt」というコマンドを実行すると、内部では、

args = 3
args[0] = "cat"
args[1] = "-n"
args[2] = "hello.txt"

という風な値が入ります。これは、「この"cat"コマンドが実行された際、2つのオプションが設定されました。一つ目が"-n"で、二つ目が"hello.txt"という意味です」ということになるのです。オプションがなければ、argcは1になり、args[0]の中にはコマンド名が入るだけです。

なお、戻り値としては通常、プログラムが通常終了した場合は、return 0で、0を返すことが期待されます。何らかの異常があった場合は、return -1などとして、-1など、それ以外の値で返します。0以外には特に規定がありません。

MS-DOSなどでも同様の仕様が使われる

のちにC言語は、PCでも使用されるようになり、Windowsが出る以前のポピュラーなOSである、MS-DOSは、UNIXライクな構造をしていたことから、このような仕組みもこのまま受け継ぎました。

したがって、本来ならこのような書式で書くことが望ましいでしょうが、ここではあえて、特に必要のない限り、シンプルな書式を用いることにしています。