本物のC

C の知識:その他のライブラリ


limits.h

整数型の実際のサイズに関する情報を提供します。

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 スタートである点に注意が必要です。

mktimelocaltimeと逆の変換をします。また二つの日時の差は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は符号無し整数型を表します。

何ビットの型を実装するかは処理系次第ですが、charintなど既にある型は定義されていなければなりません。例えば標準の整数型が「C の基本:型」の通りの範囲を持つならば、int8_tint16_tint32_tint64_tの四つとその符号無し版は必ず利用できます。

ポインタ型

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