[C99] 第6回 プログラムの開始と終了
C99におけるプログラムの開始と終了の仕様は、C++とくらべるとずっと単純です。これは主として、C99にはコンストラクタやデストラクタを持つオブジェクトが存在しないからです。
プログラムの開始
プログラムの開始時には、C++でいうところの静的初期化だけが行われ、動的初期化は行われません。コンストラクタを持つオブジェクトがないからですが、それ以外にも、静的記憶域期間を持つオブジェクトの初期化子には、定数式しか指定できないからでもあります。具体的には、
#include <math.h>
double sqrt2 = sqrt(2.0); /* エラー */
double sqrt2 = sqrt(2.0); /* エラー */
のようなコードはコンパイルエラーになります。このことにより、C99では、処理系が提供する開始処理(いわゆるスタートアップ)をのぞき、main より先に実行される処理がないことになります。
プログラムの終了
C99では、デストラクタを持つオブジェクトが存在しないため、プログラムの終了は非常に簡単です。exit を呼び出して正常終了する場合、まずは atexit で登録した終了処理関数を呼び出します。次に、オープンしているすべての出力ストリームをフラッシュしたあと、入力・出力を問わずすべてのストリームをクローズします。そして、tmpfile で作成した一時ファイルを削除します。最後に、ホスト環境に制御を移します。終了コードがどのように扱われるかは、規格上は未規定です。
main 関数
C99の main 関数は、C++の main 関数と同じですが、以下の点が異なります*1。
main 関数の呼び出し
C++では、main 関数をプログラムから呼び出すことも、main 関数へのポインタを取得することもできませんでした。しかし、C99では、他の関数と同じように、main 関数を呼び出すことも、main 関数へのポインタを取得することもできます。
*1 C90では、main 関数の return 文が省略された場合、不定値をホスト環境に返します。
この記事のトラックバックURL:
http://www.kijineko.co.jp/trackback/828
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- C99関数・マクロ・前処理スクリプト集
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ベターCとしてのC++
- マイコン メモ
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 象の卵を探して...
- 車輪の再発明
- 過去の情報