C の知識:その他のライブラリ
limits.h
整数型の実際のサイズに関する情報を提供します。
- charのビット数 CHAR_BIT
- マルチバイト文字の最大ビット数 MB_LEN_MAX
- 整数型の最小値・最大値- SCHAR_MIN SCHAR_MAX UCHAR_MAX CHAR_MIN CHAR_MAX
- SHRT_MIN SHRT_MAX USHRT_MAX
- INT_MIN INT_MAX UINT_MAX
- LONG_MIN LONG_MAX ULONG_MAX
- LLONG_MIN LLONG_MAX ULLONG_MAX
 
time.h
time.hは時刻を扱います。
| time_t time(time_t *timer); | |
| struct tm *gmtime(const time_t *timer); | |
| struct tm *localtime(const time_t *timer); | 
現時刻はtimeで得られますが、time_t型となっているこれは一般に UNIX 時間で、UTC(世界協定時)1970/01/01 00:00:00 からの経過秒数になっています。
これをポインタでlocaltimeに渡すと、以下の様な要素を持つstruct tmへのポインタが返ります。localtimeはコンピュータの設定されているタイムゾーンでの時刻になりますが、gmtimeは(名前は GMT ですが)UTC を返します。
| 要素 | 内容 | 値 | 
|---|---|---|
| tm_year | 年 | (西暦 1900 年が 0) | 
| tm_mon | 月 | 0 ~ 11 | 
| tm_mday | 日 | 1 ~ 31 | 
| tm_hour | 時 | 0 ~ 23 | 
| tm_min | 分 | 0 ~ 59 | 
| tm_sec | 秒 | 0 ~ 60 | 
| tm_wday | 曜日 | 0 ~ 6 (日曜日が 0) | 
| tm_yday | 元日からの 経過日数 | 0 ~ 365 | 
| tm_isdst | 夏時間か? | 正:夏時間 0:夏時間でない 負:不明 | 
月が 0 スタートである点に注意が必要です。
mktimeはlocaltimeと逆の変換をします。また二つの日時の差はdifftimeで求められます。
| time_t mktime(struct tm *timeptr); | |
| double difftime(time_t time1, time_t time0); | 
stdint.h
stdint.hは処理系に依存しないサイズの数値型を提供します。
整数型
intN_tは N ビットの符号付き整数型(でパディングビットが無く 2 の補数表現のもの7.18.1.1#1)を、uintN_tは符号無し整数型を表します。
何ビットの型を実装するかは処理系次第ですが、charやintなど既にある型は定義されていなければなりません。例えば標準の整数型が「C の基本:型」の通りの範囲を持つならば、int8_tint16_tint32_tint64_tの四つとその符号無し版は必ず利用できます。
ポインタ型
intptr_tとuintptr_tは、任意のポインタの値を表現できる整数型を表します。
inttypes.h
stdint.hの型に対するフォーマット指定子を提供します。
int32_tにはPRId32マクロを、uintptr_tにはPRIuPTRマクロを、という感じで具体的には
| uint64_t n = 0x12345678; | |
| printf("n = 0x%" PRIx64 "\n", n); | 
と使います。(これらのマクロは文字列に置換され、「C の知識:リテラル」で説明した様に隣接する文字列リテラルは結合されます。)
stdarg.h
C の関数は引数の最後に, ...を付ける事で可変長引数(variable argument)を受け取れます。
| int sum(int n, ...); | 
stdarg.hはこの可変長引数を扱う為のマクロを提供します。
| void va_start(va_list ap, parmN); | |
| type va_arg(va_list ap, type); | |
| void va_end(va_list ap); | 
これらを使うにはまずva_listを用意し、paramNに...の直前の引数を指定します。va_argにより型を指定して一つずつ引数を取り出し、最後にはva_endを呼び出す必要があります。
具体的には
| int sum(int n, ...) | |
| { | |
| int r = 0; | |
| va_list args; | |
| va_start(args, n); | |
| for (int i = 0; i < n; i++) | |
| r += va_arg(args, int); | |
| va_end(args); | |
| return r; | |
| } | 
とするとsumは第一引数に指定した個数のint型整数を足し合わせる関数になり、例えばsum(3, 1, 2, 3)は 1 + 2 + 3 = 6 を返します。