1.寻找 time_t 定义
本人的系统是:Debian GNU/Linux jessie/sid 64 位
寻找time_t 的定义:
在 /usr/include/time.h 文件中的 time_t 定义如下:
typedef __time_t time_t;
于是寻找 __time_t 的定义。
在 /usr/include/x86_64-linux-gnu/bits/types.h 文件中的 __time_t 的定义如下:
__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
于是寻找 __TIME_T_TYPE 的定义,然后迷路了……
结果在 /usr/include/x86_64-linux-gnu/bits/typesizes.h 中找到了如下定义
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE
暂且估计 time_t 是 long 类型吧。
2.验证 time_t
用如下代码进行验证,文件名保存为 03.c:
#include#include int main(int argc, char *argv[]){ time_t timer = 0xFFFFFFFFFF; printf("sizeof(time_t) = %ld\n", sizeof(time_t)); printf("timer = %ld\n", timer); printf("timer = %s\n", ctime(&timer)); return 0;}
使用gcc 开启警告选项,进行编译:
gcc 03.c -Wall
无错误,无警告。
其中的
printf("timer = %ld\n", timer);
也侧面验证了time_t 为 long 或者是 unsigned long 类型。因为在gcc 开启警告的模式下,输出类型不匹配会发出警告。如果将其改为:
printf("timer = %d\n", timer);
则会产生如下警告:
$ gcc 03.c -Wall03.c: In function ‘main’:03.c:10:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘time_t’ [-Wformat=] printf("timer = %d\n", timer); ^
不过,究竟是 long 还是 unsigned long 不能通过警告来确定,因为 "%lu" 和 "%ld" 两个都无警告信息产生。
运行之前的编译好的源程序,输出结果如下:
$ ./a.out sizeof(time_t) = 8timer = 1099511627775timer = Mon Feb 20 08:36:15 36812
本人系统为64位,long 位64位整型,这个数字就好大好大好大了,所以64位系统不用担心时间溢出的问题了。
根据《UNIX网络编程(第3版)》卷1中文版,P24页:
现有32位Unix系统上共同的编程模型位ILP32模型,表示整数(I)、长整数(L)和指针(P)都占用32位。64位Unix系统上变得流行的模型称为LP64模型,表示只有长整数(L)和指针(P)占用64位。
但是32位系统,如果定义位long 可能就会有问题了。32 位的 long只能跑到到 2038年,和《C专家编程》 书上P5 的案例相同。