C11におけるプログラムの開始と終了の仕様は、C++とくらべるとずっと単純です。これは主として、C11にはコンストラクタやデストラクタを持つオブジェクトが存在しないからです。

プログラムの開始

プログラムの開始時には、C++でいうところの静的初期化だけが行われ、動的初期化は行われません。コンストラクタを持つオブジェクトがないからですが、それ以外にも、静的記憶域期間を持つオブジェクトの初期化子には、定数式しか指定できないからでもあります。具体的には、

のようなコードはコンパイルエラーになります。このことにより、C11では、処理系が提供する開始処理(いわゆるスタートアップ)をのぞき、mainより先に実行される処理がないことになります。

プログラムの終了

C11では、デストラクタを持つオブジェクトが存在しないため、プログラムの終了は非常に簡単です。exit関数を呼び出して正常終了する場合、まずはatexitで登録した終了処理関数を呼び出します。次に、オープンしているすべての出力ストリームをフラッシュしたあと、入力・出力を問わずすべてのストリームをクローズします。そして、tmpfileで作成した一時ファイルを削除します。最後に、ホスト環境に制御を移します。終了コードがどのように扱われるかは、規格上は未規定です。

exit以外に、C11では_Exit関数やquick_exit関数で終了することもできます。_Exitではatexit、at_quit_exit、signalで登録した関数を呼び出さずに終了します(ストリームの後始末をするかどうかは処理系定義です)。quick_exitではat_quit_exitで登録した関数を呼び出してから_Exitを呼び出します。

main関数

C11のmain関数は、C++のmain関数と同じですが、以下の点が異なります。

main関数の呼び出し

C++では、main関数をプログラムから呼び出すことも、main関数へのポインタを取得することもできませんでした。しかし、C11では、他の関数と同じように、main関数を呼び出すことも、main関数へのポインタを取得することもできます。


↑ モダンC++プログラマーのためのC11入門