看上去一切正常,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的定义变成了傀儡,基本没意义了。
结论:使用枚举类型时需要特别小心,初始化的意义往往在代码出问题后才能体会到。