c++枚举在跨平台下的陷进

看上去一切正常,Windows服务器下也运行正常,但Linux服务器下却无法自动触发事件(后来发现,应该也无法显式触发事件,但eventId在设置触发状态时被强转赋值了另一个int,避免了这个问题,也增加了问题的隐蔽性。)
GDB调试后发现event.prvIndex,event.curIndex都为64位,且低32位正常,而高32位随机。
问题在于Linux下代码(3)强转64位的枚举地址为32位int地址,且HelpEventData::curIndex等没有初始化为0。修改代码可以引入一个int临时变量解决。
问题1、HelpEventIndex枚举的sizeof在vc8里为4,gcc里为8,从HelpEventIndex的PHE_FORCE_DWORD(-1 or unsigned 0xffffffff)可以理解这2者的差异。
问题2、PHE_IllegalIndex和PHE_FORCE_DWORD的定义显得很诡异,有意思的是PHE_FORCE_DWORD得初衷在于使代码(3)能够强转而少用一个临时变量。
问题3、有这样一种解决方案,不显式使用HelpEventIndex,转而完全使用int替代运算,确实可以避免这些问题,不过enum的定义变成了傀儡,基本没意义了。
结论:使用枚举类型时需要特别小心,初始化的意义往往在代码出问题后才能体会到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值