このヘッダの目的
<stdlib.h>は、汎用の関数群を実装する。
ライブラリの設計思想から言うと、このヘッダのように何もかもひとまとめにするのは望ましいこととはいえないが、Cの標準ライブラリはそれが問題にならない程度には小さい。
定義済み識別子
働き
それぞれのマクロ定数が展開されるもの及び型の意味は次の通り。
EXIT_FAILURE | exit() に引数として渡すことで実行環境に不成功裡に終了したことを伝えることができる整数表現に展開される |
EXIT_SUCCESS | exit() に引数として渡すことで実行環境に成功裡に終了したことを伝えることができる整数表現に展開される |
MB_CUR_MAX | 現在のロケールで扱うことのできる複バイト文字の最大バイト数を表す正の整数表現に展開される |
NULL | ヌルポインタ(stddef.h) |
RAND_MAX | rand() が返す値の最大値を表す整数定数に展開される |
div_t | div関数の返り値の構造体型 |
ldiv_t | ldiv関数の返り値の構造体型 |
size_t | sizeof演算子の結果の型(stddef.h) |
wchar_t | サポートされている地域言語のどんな文字も収納することのできる型(stddef.h) |
複バイト文字関数( mblen() 、
mbtowc() 、 wctomb() )の動作は現在のロケールの LC_CTYPE
分野に影響を受ける。
状態依存の文字コードでは、それぞれの関数は、文字へのポインタ引数 s へヌルポインタを渡して呼び出すことにより初期状態に復帰する。
続けて s にヌルポインタでないポインタを渡すことにより、関数の初期状態は必要に応じて変化する。
s にヌルポインタを渡して呼び出すことにより、関数は、文字コードが状態依存であれば非ゼロを返し、そうでなければゼロを返す。
LC_CTYPE 分野を変えることによって関数のシフト状態は不定になる。
解説
複バイト文字とは、文字通り一文字当たりに2バイト以上を必要とする文字のことである。 日本語は、漢字の数が1バイトで現すことができる数より多いので、複バイト文字である。
これに対し、ワイド文字(wchar_t)とは、複バイト文字を含む全ての文字を一意的に表すことができる型である。 複バイト文字が可変長バイト数である場合があることや、シフト状態を持つことがあるのに対して、ワイド文字は固定長で、シフト状態をもたないことに注意されたい。
パソコンで接する機会がある日本語の文字コードには、 JIS コード、 EUC-JP 、 Shift-JIS 、 UTF-8 、 UTF-16 などがある。 (どうでもいいが、このリファレンスは JIS コードで書かれている。) この中でも JIS コードは「シフト状態」を持つ文字コードであり、規格でいう「状態依存の文字コード」である。 簡単に流れを説明すると、日本語を使う時はまずシフトインし、日本語の複バイト文字列を記述し、最後にシフトアウトして元の状態に戻る、という手順を踏む。 このため、読み込む時点でのシフト状態によって文字の解釈の仕方が異なってしまうので、複バイト文字関数にヌルポインタ渡すことによってシフト状態を制御することができるのだ。
こんな不便な手順を踏まなければならない代わりに、 JIS は7ビットで表せるため、ネットワークでは良く使われる。 電子メールはほとんどが JIS である。
ただし注意すべきことは、 JIS と C の相性は悪いということである。 シフト中の文字はすべて最上位ビットが立っていないので( 0x7f 以下)、 ASCII コードと重複する部分がある。 よって、シフト状態を正しく把握できていないと、 '%' のような文字が入ってきて printf 系の関数の動作がおかしくなる。 Windows なら Shift-JIS 、 Unix 系の OS なら EUC-JP を使うのが常道である。
だが、多様なプラットフォームで互換性のあるプログラムを作りたいというのであれば、 Shift-JIS や EUC-JP のようなローカルな文字コードの代わりに Unicode を使うべきである。 Unicode は全世界の文字を含む文字セットであり、日本語のような複バイトのデータを長く保管するには最高の方法である。 Unicode には、文字列としてのエンコーディングに幾つか種類があるが、 よく使われる UTF(UCS Transformation Format)-8 は複バイト文字に必ず最上位ビットを使い、シフト状態も持たないので、 C でも扱いやすい。
このリファレンスのサンプルソースには英語コメントが多いが、それはこのような日本語を含むソースが事故を招きやすいという事情からきた習慣である。