DWORD转换为格式时出错 time_t注意!

本文转载自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(&gtime, (time_t*)&dwordTime);//此处出错

 

经过调查如果将程序修改成下面这样执行就OK:

struct tm gtime;

DOWRD dwordTime = xxxxxx;

time_t time = (time_t)dwordTime;

localtime_s(&gtime,&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好一些。

那么之后的修改中强制类型转换time_t time = (time_t)dwordTime; 为什么没问题呢,这应该是强制类型转换的基础知识,对指针做强制类型转换的时候,并没有重新申请空间而只是转换结果的指针指向了转换目标的指针指向的地址,如果转换前后的类型所使用的内存空间不一样,结果是不可预知的,所以指针的强制类型转换一定要小心,而值类型的强制类型转换会申请新的空间并且有一定的转换规则(拷贝高位之类的),相对要安全一些,不过也要了解转换规则才可以使用。
================================
正好我在写一个相关的程序的时候,同样被那个定义搞伤了,单步跟踪到系统函数里面发现有段代码不执行~~~上网查到了这篇文章,问题解决了~~
记录以备忘。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值