//代码背景是完成新手指引功能,为了方便脚本调用,各指引允许形成链式结构,以便触发完成时自动触发下一个指引。 //1、索引枚举,c++代码触发 enum HelpEventIndex { PHE_IllegalIndex = -1, // 非法的索引 PHE_EnterInGame = 0, //... PHE_FORCE_DWORD = 0xffffffff, }; //2、指引数据(配置表结构) struct HelpEventData { HelpEventIndex prvIndex; HelpEventIndex curIndex; //... }; //3、读取配置表 fst_help_event->GetInteger(row, "prvIndex", -1, (int*)&event.prvIndex); fst_help_event->GetInteger(row, "curIndex", 0, (int*)&event.curIndex); //4、完成了一个新手指引,看看有没有需要自动触发的 //...设置触发状态 HelpEventIndex autoIndex = KHelpEventSetting::GetInstance()->GetNextEvent(eventId); if (autoIndex == PHE_IllegalIndex) return; SetPopupEvent(autoIndex, 1); //自动触发 //5、调用代码 SetPopupEvent(0, 1); SetPopupEvent(8, 2);

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

c++枚举在跨平台下的陷进相关推荐

  1. javaWeb开发陷进与谬误

    一.编程经验与感悟 经验:乐趣(热爱才是最好的老师--爱恩斯坦): 真正是自己跨入编程门槛的是一个实际的项目,在项目中经历了不懂,解决,不懂,解决··· ···之后才能使自己提升.其实编程并不难,只要 ...

  2. 高级shell脚本编程之函数库、信号与陷进、文件处理、数组、安全性

    高级shell脚本编程之函数库.信号与陷进.文件处理.数组.安全性 1.函数库 把所有需要用到的函数都放到一个文件中,然后每个脚本的开头包含这个文件.例如: #!/bin/sh scope(){ lo ...

  3. 序列赋值引发的Python列表陷进

    序列赋值是Python默认操作,如果使用不当,有可能会掉入语法陷阱. + +是指把两个序列的元素拼接在一起.通常+号两侧的序列由相同类型的数据所构成,在拼接的过程中,两个被操作的序列都不会被修改,Py ...

  4. 两组的数据平均值合并_不要进入数据陷进

    学习统计让我们不再被一些数据迷惑进入数据陷进(例如平均工资)从而做出正确的决策.描述性统计分析包括数据的分布.集中.波动的测度指标. 平均值:一组数据的加和除以数据的个数(容易随极端值变化) 中位数: ...

  5. fast路由器服务器未响应,win7系统下fast路由器进不了设置界面如何解决

    最近有不少win7纯净版系统用户到本站反馈说碰到这样一个问题,就是在使用fast路由器的时候,进不了设置界面,导致无法进行一系列设置,该怎么办呢,接下来给大家讲解一下win7系统下fast路由器进不了 ...

  6. c陷进与缺陷笔记(1)

    2011-11-13 只需记住 a[i]  相当于  *(a+i) 考虑不对称边界偏好 让指针指向第一个未背占用的字符 *bufptr++ = c; //缓冲区申明 define N 1024 sta ...

  7. c陷进与缺陷笔记(5)

    2011-11-17 插入代码会出现下面的问题,谁能帮忙解决一下!谢谢! for c陷进与缺陷是一本好书,可惜太老了(ASNI C之前的书),但不能说过时! 这种写法会防止出现 把 等于号打成 赋值号 ...

  8. linux下的16进制编辑器,Linux下的16进制编辑器 Tweak

    Linux下的16进制编辑器 Tweak 发布时间:2012-08-02 15:28:29来源:红联作者:empast tweak是可以在命令行方式下使用的16进制编辑器,在Ubuntu Linux下 ...

  9. 用友YoSuite以高效增长的力量,助力春耕按下生产“快进键”

    当下,ChatGPT和元宇宙是当前最热门的科技领域话题,这些高科技领域的发展让我们看到了人工智能与现实的无限可能.民以食为天,农业是国之根本,农业也是关系到每个人生活的重要领域.春耕备耕正当时,让我们 ...

最新文章

  1. Python中*args和**kwargs的区别
  2. MSSQL 2012 拒绝了对对象 'extended_properties' (数据库 'mssqlsystemresource',架构 'sys')的 SELECT 权限...
  3. java面试题2016_2016最新java面试题 详细版
  4. JAVA springcloud ssm b2b2c多用户商城系统-docker-hystrix-dashboard-turbine(九)
  5. racte margin 居中 失效_上干货,微信用情侣签名她肯定很开心,微信个性签名居中隐藏技巧...
  6. 高德地图android4,Android高德之旅(4)我的位置
  7. 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
  8. oracle不属于集合操作,oracle 笔试题
  9. android发送短信指定收件人,android-发送短信给收件人
  10. python文件读取写入实践_python文件写入实例分析
  11. 搭建jenkins+gitlab+tomcat+maven步骤
  12. iOS FFmpeg 优秀博客(资源)集锦
  13. alter table *** add constraint *** 用法---约束
  14. 三角形状的点阵模糊效果iOS源码
  15. 图片像素转换工具(pixelmash 2020) v2020.1.0
  16. autojs之多线程-Threads
  17. java基于安卓Android/微信小程序的高校校园跑腿系统 uniapp
  18. OGNL表达式的基本用法
  19. 51汇编——LCD1602显示
  20. clion使用技巧大全

热门文章

  1. [apk破解]百变遥控,无限积分,去除广告
  2. Python学习笔记:第四站 往哪走
  3. 手把手教你用Python网络爬虫实现上海证券交易所定期报告pdf文件下载(附代码)...
  4. 广电运通余昌鸿:像“路明非”一样,努力做正确的事丨对话MVP
  5. 决策树算法面试问题汇总
  6. 诺基亚S40第3版 (j2me的天堂)
  7. Linux USB实现网络共享
  8. python发送notes邮件_使用python 驱动 lotus notes发送邮件 | 学步园
  9. 专利代理人信息查询网站
  10. Socket多人聊天MFC版