本文转载自http://bluezealot.spaces.live.com/blog/cns!A07F3383AB036B6A!392.entry
原文如下:
注意VC9中的time_t
最近碰到了一个问题,原先用VS2003编译的非托管C程序,移植到VS2008上编译出来的程序不能用了,执行到localtime_s这个语句的时候出错了。
原先的程序是这样的:
struct tm gtime;
DOWRD dwordTime = xxxxxx;//此处数据随便所以用xxxxxx代替
localtime_s(>ime, (time_t*)&dwordTime);//此处出错
经过调查如果将程序修改成下面这样执行就OK了:
struct tm gtime;
DOWRD dwordTime = xxxxxx;
time_t time = (time_t)dwordTime;
localtime_s(>ime,&time);
从上面这段程序来看,很难看出看出来问题出在哪儿。但是如果我们看一下VC9中关于time_t的定义就可以找到前面那段代码的问题所在了。
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t; /* time value */
#else
typedef __time64_t time_t; /* time value */
#endif
可以看出time_t的默认类型是__time64_t也就是int64,现在明白之前的程序为什么出错了,因为在没有宏定义_USE_32BIT_TIME_T的情况下,localtime_s的第二个参数要求是指向int64位的指针,但是原先的定义DWORD类型的所以出错了。如果使用EVENTLOGRECORD结构体的关于时间的成员转换成tm的话要小心,因为EVENTLOGRECORD结构体重的时间成员全部是DWORD类型的。
那么我们在编译的preprossesor中定义_USE_32BIT_TIME_T可不可以呢,当然是可以的,我们可以不修改程序,但是如果碰到2038年以后的时间的话localtime_s会出错,所以还是用int64型的time_t好一些。