|
|
|
| 2008/07/06 21:09||▲
|
|
|
今回からホスト環境用のライブラリの実装に入ります。ホスト環境用といっても、最初はやはり地味なライブラリ要素が続きます。今回はエラー番号のためのマクロを定義する<errno.h>の実装です。
標準規格で、<errno.h>の中で定義することを要求されているマクロは四つです。すなわち、errno、EDOM、ERANGE、およびEILSEQです。このうち、errnoを除く三つはエラーの状態を表す正の整数値に定義します。値は勝手に決めてもよいのですが、一応Cygwinに合わせて
#define EDOM 33 #define ERANGE 34 #define EILSEQ 138
としておきます。
さて、肝心のerrnoですが、最も簡単な実装は、int型の外部変数にすることです。シングルタスクの環境であればこれで十分ですが、マルチタスクの場合にはいろいろ厄介な問題がついて回ります。
errno以外にも、strtokやasctimeなど、静的変数をアプリケーションに参照させるタイプのものは、排他制御だけではマルチタスク対応になりません。タスクごとに、それぞれ異なる記憶域を設けて、実行中のタスクに応じた記憶域を参照させなければならないからです。
タスクに対して局所的な記憶域の扱いは、後ほどまとめて対応することにし、とりあえず現時点では最小限の実装にとどめておきます。ただし、ヘッダ自体はこれでフィックスしたいので、errnoの実体を関数呼び出しにしておきます。
#ifdef __cplusplus extern "C" #endif int *__errno(void);
#define errno (*__errno())
関数__errnoの定義は、現段階では
int *__errno(void) { static int e; return &e; }
とするにとどめておきます。
|
| 2006/01/30 01:22|プログラム診断|TB:0|CM:0|▲
|
|
|
|
|
ホーム
全記事一覧
|