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 を返します。