Hatena::ブログ(Diary)

mooz deceives you

(about 'mooz) ; => "See http://mooz.github.com/index-ja.html"

 | 

July 10 (Sat), 2010

time_t をめぐる冒険

time_t は何を typedef したものか?

「time_t は何を typedef したもの?」と聞かれ, 答えることが出来なかったので調べることにした.

time.h

とりあえず time.h を覗いてみると, 77 行目に time_t の typedef を発見.

typedef __time_t time_t;

ということで, time_t は __time_t を typedef したものであることが分かった. めでたしめでたし.

__time_t

まあ, そんなことで終わってしまってはしょうがないので, __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

__TIME_T_TYPE で M-x lgrep (Emacs 的な意味で) すると bits/typesizes.h というファイルが引っかかった. そして 50 行目を見ると

#define __TIME_T_TYPE		__SLONGWORD_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 かと思っていた.

リンク元
 |