[迷信] プログラムは必ず main から始まる

C/C++の入門書を読めば、プログラムは main から始まると書かれています。そのこと自体は間違っていませんが、「必ず」そうかというと三つの意味で正しくありません。ひとつはスタートアップの存在であり、ひとつはフリースタンディング環境の場合であり、もうひとつはC++における非局所オブジェクトの動的初期化です。

スタートアップ

知っている人から見れば屁理屈のように思うかもしれませんが、知らない人も少なくないと思いますので、あえて採り上げることにします。main 関数が呼び出される前にはスタートアップという処理が実行されます。スタートアップでは、少なくとも、main 関数に渡す引数を組み立て、標準入力・標準出力・標準エラーの三つのストリームをオープンし、そして main 関数を呼び出します。main 関数からかえってきた後は、exit 関数と同等の処理を行います。

フリースタンディング環境

フリースタンディング環境は、OSに依存しない実行環境のことです。組込みプログラムなどはフリースタンディング環境で動作することが多いといえます(組込みでもLinuxなどのOSを搭載することは少なくないので、組込みだからフリースタンディング環境ということにはなりません)。

フリースタンディング環境では、プログラムの最初に呼び出される関数は main とは限りません。最初に呼び出される関数がどんな名前でどんな型を持つかは処理系定義です。

C++における非局所オブジェクトの動的初期化

C++では、非局所オブジェクト、すなわち関数の外で定義したオブジェクトが定数式以外の初期化子を持つ場合や、コンストラクタを持つ場合には、動的に初期化が行われます。この初期化は main 関数が呼び出される前に実行されます。例えば、初期化子で関数呼び出しを行うことができますし、コンストラクタは一種の関数ですから、main 関数より前にユーザープログラムが実行されていることになります。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/595