• [摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)


    =============================================================================================

    20140518_第一次修改                       ccb_warlock

    =============================================================================================


    摘抄来源:      http://blog.csdn.net/juana1/article/details/6214117

    看见这篇文章是为了寻找(error C2668: 'fabs' : ambiguous call to overloaded function)时而看到的,当时是将vc6.0的源程序直接通过vs2005进行运行而发现这个错误。
    vc6.0源码:
                  BOOL m = ( fabs(y1-y0) <= fabs(x1-x0) );//6.0编译器编译组件正确

    vs2005源码:
                  BOOL m = ( fabs((double)y1-(double)y0) <= fabs((double)x1-(double)x0) );//2005编译器正确


    该文章其他内容由于时间原因暂未验证,先记录在此。


    最近由于要在SISCO的MMS库基础上开发,需将开发平台由VC6.0升级至VS2008,所以需要将原有的项目迁移,免不了碰到移植上的一些问题,特将它们归纳如下:
    消息映射
    VS2008对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2008下编译不通过

    a. ON_MESSAGE(message,OnMyMessage);
       OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);如果不符合,则有错误提示:
      
         error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
            在匹配目标类型的范围内没有具有该名称的函数
         error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(void)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
            在匹配目标类型的范围内没有具有该名称的函数
    b. ON_COMMAND_EX(id,OnMyMessage2);
       在VS2008中,OnMyMessage返回值必须为BOOL,且含有一个 UINT 参数指出了命令ID,其形式为:afx_msg BOOL OnMyMessage(UINT);如果不符合,
       则有错误提示,如在VC6中,OnMyMessage2的定义为afx_msg BOOL OnViewZoomBar()时亦可正常编译通过,但在VS2008下,有错误提示:
      
       error C2440: “static_cast”: 无法从“BOOL (__thiscall CMainFrame::* )(void)”转换为“BOOL (__thiscall CCmdTarget::* )(UINT)”
            在匹配目标类型的范围内没有具有该名称的函数
        error C2440: “static_cast”: 无法从“BOOL (__thiscall CMainFrame::* )(void)”转换为“BOOL (__thiscall CCmdTarget::* )(UINT)”
            在匹配目标类型的范围内没有具有该名称的函数

    编译找不到并无法升级vc90.pdb的情况
       把一个VC6的工程转换为VS2008的工程后,编译总是出现找不到而且不能升级vc90.pdb文件的问题。重新编译了也不行。 
    这个vs2008一个著名的bug。详情可以参见
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=309462

    官方现有解决方案如下:
           I have found an alternate way for the time beging to avoid C2471 error but it works only in the case of successful release build.
    for this click Build menu than Configuration manager than create a new setting from release settings. Change following things in your project settings as :

    C/C++ | General | Debug Information format | C7 Compatible (/Z7)

    C/C++ | Code Generation | Enable String Pooling | Yes (/GF)

    Linker |Debuging |General Debug Info | Yes (/DEBUG)
       也就是将项目/**属性下
       C/C++|常规|调试信息格式 处选择"C7兼容(/Z7)"
       C/C++|代码生成|启用字符串池 处选择"是(/GF)"
       链接器|调试|生成调试信息 处选择"是(/DEBUG)"即可
    这么设置了之后,每次生成项目,它都会重新编译,耐心等待呗O(∩_∩)O~
            
    3 字符处理
     在c中广泛使用的strcpy,strcat,strstr等等推荐使用更为安全的strcpy_s,strcat_s,strstr_s等来代替

    4 数学函数检查
     VS2008中,数学函数的参数检查更为严格,fabs、pow等函数都严格限制参数类型,如fabs(a)会引起一个错误提示如下:
      
        error C2668: “fabs”: 对重载函数的调用不明确
      D:/Program Files/Microsoft Visual Studio 9.0/VC/include/math.h(557): 可能是“long double fabs(long double)”
      D:/Program Files/Microsoft Visual Studio 9.0/VC/include/math.h(509): 或“float fabs(float)”
      D:/Program Files/Microsoft Visual Studio 9.0/VC/include/math.h(119): 或“double fabs(double)”
      试图匹配参数列表“(long)”时
       正确的使用为fabs((double)a)
       
    5 更加符合C++标准
        如在VC6中,在FOR循环中的循环变量的定义的作用域延伸到循环体外,VS2008则修正了这样的bug。
        VC6:
        for(int i=0;i<100;i++)f2();  
        for(i = 1;i<10;i++)f1();    //i已经定义
        而有VS2005中,第二句的i必须重新定义

  • 相关阅读:
    SQL获得表的行数
    sql server2008用ip远程连接
    sql设置字段默认值
    用c# 实现设计器 DesignSurface<转>
    DSOFramer.ocx 控件使用<转>
    浅谈JavaScript编程语言的编码规范<转>
    主要是取得2個Collection 裏,相同、相異、聯集的部份<转>
    VS2008无法切换到视图设计器
    使用HttpModule来禁用Web表单重复提交<转>
    WebIM组件设计<转>
  • 原文地址:https://www.cnblogs.com/straycats/p/5248730.html
Copyright © 2020-2023  润新知