C语言学习日记(5)——time_t的类型与typedef
昨天输出时间的程序里面定义了一个time_t类型的变量,这是一种什么样的变量呢?小猫知道的C语言中的内置数据类型有char,int,long,float,double等等,但对time_t类型不太了解。因为在写程序时用到了time.h头文件,所以可能在time.h头文件中可以找到它的定义,试试看吧。
小猫打开D:\mingw64\x86_64-w64-mingw32\include目录,找到了time.h这个头文件,在记事本里打开,查找time_t,发现这样一段代码:
#ifndef _TIME_T_DEFINED
#define _TIME_T_DEFINED
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif
其中有这样一行代码:
typedef __time64_t time_t;
这是什么意思呢?原来typedef是类型定义,即将一种数据类型换一个新的名称。它的使用方法很简单,和定义变量差不多,只是把变量名替换成你想要定义的类型名称就可以啦。比如我想将int类型换个名字,叫做INTEGER,那么只需要这么写:
typedef int INTEGER;
这样就新定义了一种INTEGER,它实际的类型就是int。以后,可以用int或者INTEGER定义变量,它们是等价的。例如:
INTEGER number = 100;//与int number = 100;是一样的。
知道了这些,小猫就知道了,原来typedef __time64_t time_t;这行代码告诉我们time_t类型的实际类型是__time64_t类型。但是问题又来了,__time64_t又是啥类型呢?
小猫继续在time.h文件里面查找__time64_t,找到这段代码:
#ifndef _TIME64_T_DEFINED
#define _TIME64_T_DEFINED
__MINGW_EXTENSION typedef __int64 __time64_t;
#endif
又看到typedef啦,原来__time64_t的实际类型是__int64类型。看来typedef是可以一层一层的定义的,要知道time_t类型最原始的类型,非得像剥洋葱一样一层一层的剥开它的外衣不可。这个__int64是个什么类型呢?其实光看字面意思小猫都已经感觉它应该是一个64位的整型变量,为了验证小猫的猜想对不对,小猫继续在time.h里面查找__int64,但是没有找到__int64的类型定义语句。看来不在time.h里面啊,那会在哪里呢?
正在想着去哪里找,小猫忽然想到time.h的开头应该也包含了其它头文件,要不然它怎么能使用__int64这个类型呢?于是小猫往文件最开头看,果然看到这样一行:
#include <crtdefs.h>
看来,应该在这个头文件里面。打开crtdefs.h文件查找__int64,竟然也找不到类型定义,看来在其它头文件里,于是小猫继续看crtdefs.h文件的头部,找到一条包含指令:
#include <_mingw.h>
应该在这里面了,小猫打开_mingw.h,查找__int64,果然找到几行代码,其中就包含__int64的类型定义。
#define __int8 char
#define __int16 short
#define __int32 int
#define __int64 long long //在这里
__int64类型原来就是long long类型啊,果然和猜想是一样的。
既然是long long类型,那么应该可以用转换说明符%lld进行输出。试一下看看行不行。找到昨天的代码修改一下,不用ctime函数进行转换,直接输出cur_time:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t cur_time; //定义变量
time(&cur_time); //获取当前时间
printf("%lld\n",cur_time); //将当前时间直接输出
system("pause");
return 0;
}
运行结果如下:

果然可以输出,输出了一个整数。那么这个整数代表什么意思呢?其实这个数字的意思是格林尼治时间1970年1月1日00:00:00到当前时刻的秒数。才16亿多秒,感觉也不多呢?
就到这里。开心。

更多推荐


所有评论(0)