(about 'mooz) ; => "See http://mooz.github.com/index-ja.html"
「time_t は何を typedef したもの?」と聞かれ, 答えることが出来なかったので調べることにした.
とりあえず time.h を覗いてみると, 77 行目に time_t の typedef を発見.
typedef __time_t time_t;
ということで, time_t は __time_t を typedef したものであることが分かった. めでたしめでたし.
まあ, そんなことで終わってしまってはしょうがないので, __time_t の正体を探ることに. すると time.h の 117 行目に
# include <bits/types.h> /* This defines __time_t for us. */
という記述を発見. 早速 bits/types.h を開く.
すると, 149 行目に
__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
とある. __STD_TYPE って何だ. そして __TIME_T_TYPE って何だ.
ひとまず __STD_TYPE を調べると, これは 116 行目に
# define __STD_TYPE __extension__ typedef
と定義されているマクロであることが分かった (__WORDSIZE が 32 の環境においての話. __WORDSIZE が 64 の場合は __extension__ が消える様子). つまり先ほどのコードは
__extension__ typedef __TIME_T_TYPE __time_t
となっている. 正体に近づいてきた気がしてくる.
ちなみに __extension__ をつける理由は, C99 でないコード (C89) の中で long long のような型 (C99 までは標準化されていない) を使うからだという.
__TIME_T_TYPE で M-x lgrep (Emacs 的な意味で) すると bits/typesizes.h というファイルが引っかかった. そして 50 行目を見ると
#define __TIME_T_TYPE __SLONGWORD_TYPE
とある. 次は __SLONGWORD_TYPE を探せということだ.
__SLONGWORD_TYPE で grep し, bits/types.h の 103 行目にその定義を発見. もう慣れたものだ.
#define __SLONGWORD_TYPE long int
つまり __SLONGWORD_TYPE は long int であると.
ということで, time_t は自分の環境 (32 bit) では long int であることが分かった. unsigned long かと思っていた.