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

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,所以需要将原有的项目迁移,免不了碰到移植上的一些问题,特将它们归纳如下:

1  消息映射

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必须重新定义

[摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)的更多相关文章

  1. VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。

    近期,有个项目开发,须要用到曾经项目的代码,只是曾经项目都是VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功.以下总结一下我在一个VC6项目移植到VS2008中遇到的一 ...

  2. VC6.0代码移植到VS2008运行时乱码问题解决

    转载:http://blog.sina.com.cn/s/blog_6d0cbb030101a3cs.html 问题描述:     之前用VC6.0写过一个OpenGL的程序,后来需要将其放到VS20 ...

  3. VC6.0 工程转到VS2010一些问题的描述及解决方法

    下列为VC6.0 工程转到VS2008一些问题的描述及解决方法 //////////////////////////////////////////////////////////////////// ...

  4. MFC(1):vc6.0转vs2005出现的问题

     在将vc6.0程序转换到vs2005或者vs2008.vs2010时提示:error C2440: 'static_cast' : cannot convert from 'UINT (__this ...

  5. VS2008和VC6.0下使用pthread.h头文件

    原文:http://www.cppblog.com/liquidx/archive/2009/06/16/87811.html 要在windows环境下使用 #include <pthread. ...

  6. [MFC] VS2013版本MFC工程移植到VC6.0上

    :VS虽号称“宇宙最强IDE”,但是有时候安装包太大,动不动就几个G:而且安装好之后也会多出很多几乎很难用到的部分,这对于那些处女座的人如何忍受!本文不是吐槽,而是给出一种在应急场景下,不用安装新版本 ...

  7. vc6.0转vs2005中字符串的问题

    简单一点:就是project->Property->Configuration Property-->general-->Character Set:No Set即可.详细分析 ...

  8. 解决安装VC6.0后出现MSDEV.EXE错误,无法用打开工程解决方法

    问题:安装VC6.0后,在打开项目或添加文件时,出现如下错误: 可能导致原因:由于Ms安装软件的兼容性问题,导致VC6.0安装不完全, 解决方法:--网上打sp6补丁的方法貌似不可用,所以可以采用另一 ...

  9. vc6.0 PK vs2010

    从VC++6.0不足看VisualC++2010新特性 说起VC,有人想到维生素C(维C),有人想到风险投资(venture capital), 程序员们尤其是做底层开发的程序员或老程序员们第一感觉肯 ...

随机推荐

  1. TeamTalk安装测试

    TeamTalk介绍 项目框架 TeamTalk是蘑菇街的开源项目,github维护的最后时间是2015但是仍然是一款值得学习的好项目,麻雀虽小五脏俱全,本项目涉及到多个平台.多种语言,简单关系如下图 ...

  2. Postgres中表和元组的组织方式

    PG version 9.5.3 PG中四种堆文件: 普通堆 临时堆 序列堆 TOAST表 PageHeaderData长度为24(截图为8.4版本,20字节)个字节包含的内容如下: 空闲空间的起始和 ...

  3. hicoder1142 三分求极值

    在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 我们代入公式,有: $d = min(\sqrt{(X - x)^2+(aX^2+bX+c-y)^2 ...

  4. BFS求最短路 Abbottt's Revenge UVa 816

    本题的题意是输入起点,朝向和终点,求一条最短路径(多解时任意输出一个即可) 本题的主要代码是bfs求解,就是以下代码中的slove的主要部分,通过起点按照路径的长度来寻找最短路径,输出最先到终点的一系 ...

  5. TCP头部分析与确认号的理解

    1.TCP的特点: 基于字节流面向连接可靠传输缓冲传输全双工流量控制 2.头部格式和说明 图源百度.如下图示,就是TCP包的头部结构.可以看到这个头部最少有4x5=20个字节. 另外还需要理解TCP协 ...

  6. django同时查询两张表的数据,合并检索对象返回

    原始需求: 1.一篇文章内容分N个版块,每篇文章的版块数量不同. 2.有个文章搜索功能,需要同时搜索标题和内容. 实现思路: 1.由于每篇文章的内容版块数量不同,因此将每个文章的标题和内容分开存入2张 ...

  7. applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.

    我用的jeesite框架,在使用定时任务时,出现一些问题,,1.在windows上项目可以在tomcat下,运行2.在linux下项目在tomcatgh下,却出现问题: 15-Dec-2017 15: ...

  8. Create-React-App创建antd-mobile开发环境(学习中的记录)

    (参考别人结合自己的整理得出,若有错误请大神指出) Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 详 ...

  9. Linux下实现视频读取(三)---Buffer的准备和数据读取

    前面主要介绍的是:V4L2 的一些设置接口,如亮度,饱和度.曝光时间,帧数,增益.白平衡等.今天看看V4L2 得到数据的几个关键ioctl,Buffer的申请和数据的抓取. 1. 初始化 Memory ...

  10. Jenkins+tomcat+jdk setup

    Jenkins download: http://jenkins-ci.org/ jdk version:jdk-7u45-linux-x64.tar.gz tomcat version:apache ...