|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|
|
| 今回から数回にわたって、<ctype.h>の中で宣言される関数の具体的な実装についてお話します。まずは、英数字の判別を行う関数群です。この中には、isalnum, isalpha, isdigit, islower, isupper, およびisxdigit関数が含まれます。
まず、効率を考えて、これらの関数はヘッダ内でインライン関数として実装することを考えます。このとき、C99ではinlineがサポートされますが、C89等での使用も考慮に入れ、GNU拡張である__inline__キーワードを使用することにします。これは、localeconv関数の実装でも利用した方法です。
static __inline__ int isalnum(int c) { return __ctype[c] & (_LOWER|_UPPER|_DIGIT); }
このように、前回定義した_LOWER等を用いて、表中の値のビットパターンを調べることで文字種別の判別を行います。is~系関数は、真のときには非0を返せばよいので、必ずしも1ではない値が返却値になりますが、これに関しては問題ないでしょう。
以下、同様に、
static __inline__ int isalpha(int c) { return __ctype[c] & (_LOWER|_UPPER); } static __inline__ int isdigit(int c) { return __ctype[c] & _DIGIT; } static __inline__ int islower(int c) { return __ctype[c] & _LOWER; } static __inline__ int isupper(int c) { return __ctype[c] & _UPPER; } static __inline__ int isxdigit(int c) { return __ctype[c] & _XDIGIT; }
のように記述することが可能です。
さて、インライン関数に関してはこれでよいのですが、<ctype.h>をインクルードせず、ユーザーが自分で関数原型を記述して、これらの関数を呼び出した場合でも正しく動作する必要があります。これを実現するには、インライン関数と同等の定義を外部関数として行う必要があります。
ライブラリが提供する外部関数は、極力、一関数につき一翻訳単位とする方が望ましいでしょう。アプリケーションであれば、これらの関連性のある関数は、一つのソースコードに列記したくなるところですが、ライブラリでそのようなことをすると、不必要な関数までリンクされる結果となり、空間効率が悪くなります。
| 2006/02/08 00:54|文字種別|TB:0|CM:0|▲
|
|
コメント
|
コメントの投稿
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/23-657c288e
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|
|
|