• 几个VC6.0到VC9.0的错误解决方案


    几个VC6.0到VC9.0的错误解决方案

    技术研究   2008-04-12 13:21   阅读794   评论2  
    字号:    

            说起现在这个引擎吧,总是没有太多时间去写,不过在半个月前就已经完成了,而且在VC6.0上是完全通过的,两个DEMO的运行也完全正常,昨天学人家追追新流,一改往日的固执,装了个VC9.0,结果出了几十个Warning,还有15个ERROR,这些都是因为VC6.0到VC9.0的转换上,还有处理规则有所变动产生了.如下是我的解决方案,希望对大家有所帮助,因为这个引擎目前还不到发布时间,所以不会有大量的源码帖出,敬请原谅:

           1.C4430和C4996警告,因为我们是在/W3下Debug,所以会出现好多这种Warning,根据我的经验,如果我们对自己的代码和DEMO非常有信心的情况下,这些警告是多余的,我们真正要去解决的是ERRORs,所以我们先把WARNING全都去了,要不然看着让人烦.....

          方法非常简单:  在命令列加入/wd4430 /wd4996,.....是不是非常简单,

         好了,现在把这几十个WARNING的编译信息去掉后,看着就不烦了,心情好多了.留给我们接下来真正要解决的东西出如下:

          2.error C2440: 'return' : 無法由 'void' 轉換為 'int'  : 

          产生这种错误的原因吧,我开始也进入了误区,我直接回头去检查代码里的RETURN,浪费了不少时间,其实这个错误是因为,在Standard C++程式库中所执行的一致性和更新工作产生的.源码如下:

     // 设置音效音量
     inline  SetEffectVolume(float fVolume)
     { return SetGroupVolume(fVolume, m_lstEffect); }    //C2240

             在Standard C++下,是不会自动去转换的,其实这不是我们代码的问题,是VC7.0开始的一个检查更改,我们要做的就是迎合VC9.0就行,不必大幅改动我们的代码部分,方案如下:

     // 设置音效音量
    void  SetEffectVolume(float fVolume)
     { return SetGroupVolume(fVolume, m_lstEffect); }  //It's OK.....

    3. error C3867: 'MyForm::ButtonCtrlClick': 函式呼叫遺漏引數清單,請用 '&MyForm::ButtonCtrlClick' 建立成員的指標

    其实这也是VS2005之后的一个更变引起的.对VC++2005的编译器完成一致性处理后也可能会产生这种错误:增强型成员指标一致性.

    //代码如下:

      // Panel2 setting
      Panel2.Create(this, 545, 0, pan2bg);

      ButtonGame.Create(&Panel2, 49, 128, btnbig, "游戏性(G)");
      ButtonGame.SetDownOffset(-1, 3);
      ON_CLICK(&ButtonGame, ButtonCtrlClick); //C3867

      ButtonVideo.Create(&Panel2, 49, 187, btnbig, "图像(V)");
      ButtonVideo.SetDownOffset(-1, 3);
      ON_CLICK(&ButtonVideo, ButtonCtrlClick);//C3867

      ButtonSound.Create(&Panel2, 49, 246, btnbig, "声音(S)");
      ButtonSound.SetDownOffset(-1, 3);
      ON_CLICK(&ButtonSound, ButtonCtrlClick);//C3867

    VS2005以后,在建立指标时,必须用&来建立和传递,哎,还真麻烦,不过这种较以往的会更安全.所以不要报怨,这种考虑是必要的.呵呵,微软还挺周道的.不错,小小表扬一下.如果用微软给的方法来解决,很麻烦,我这人向来比较懒,所以我用的方法是,ON_CLICK(&ButtonVideo, ButtonCtrlClick());//It's OK...

    4.error C2440: '<function-style-cast>' : 無法由 'void' 轉換為 'GEng::NotifyFun'

    我不废话了,还是一个RETURN的检查引起的问题.改吧....

    可能性1:宏定义在导入VC9.0时顺序换了位.在MAIN.CPP前面加上宏定义头文件"GENG_GUIOBJ.H",错误依旧

    可能性2:宏定义里地址传递上,方法不能在VC9.0里体现.

    typedef void (GEngControl::*NotifyFun)(void);  //定义部分代码
    struct NotifyEvent
    {
     NotifyEvent() : function(NULL), invoker(NULL) {}
     NotifyFun function;
     GEngControl *invoker;
    }; //没有类型转换过程.....查看控件定义里....

    //控件定义部分代码:

    #define ON_CLICK(obj, fun) /
    { /
     (obj)->OnClick.function = NotifyFun(fun); /   //C2440
     (obj)->OnClick.invoker = this; /
    }

    在这里,只有一种方法可行,也必须这么改,如果没有经验的话,一般不知道如何下手.方案如下:

     (obj*)->OnClick.function = NotifyFun(fun); /   //C2440
     (obj*)->OnClick.invoker = this; /

    到此为止,终于成功地从VC6.0转到了VC9.0上.

    总结:其实VC的高版本改变往往是为了更安全,为了我们的程序在编译成功后运行更建全考虑的,不要怕麻烦,不要一出错就换低版本的,呵呵....

              牙疼两天了,今天还没吃饭呢,好饿,但牙不争气,看见饭就烦.先写这么多吧.有什么问题,留言就行了.大家一起研究,我的GEng2D游戏引擎总算在VC9.0上安了家,还出了DEBUG版.明天看有时间把DEMO也在VC9.0编译一下不,然后发出来,让大家指教指教......

  • 相关阅读:
    asList和subList的缺陷
    oracle和mysql的拼接查询
    Google Guava的splitter用法
    docker创建mongodb并且测试代码
    GitHub 近两万Star,无需编码,可一键生成前后端代码,这个开源项目JeecgBoot有点强
    在深圳养一个娃需要多少钱?2020深圳养娃开销(Excel文本)清单公布!家长直呼扎心了!
    Win7安装AD域管理工具-Win7安装AD域远程服务器管理工具
    盘点2020年那些大厂网盘小厂网盘其他网络存储设备
    完美解决远程计算机需要网络级别身份验证RDO
    OPPO手机的指令合集(工程模式、串号等)
  • 原文地址:https://www.cnblogs.com/kevinzhwl/p/3878990.html
Copyright © 2020-2023  润新知