当前位置:C++技术网 > 资讯 > VS2010编译VC6项目出现C2440函数转换错误和消除编译警告解决方法

VS2010编译VC6项目出现C2440函数转换错误和消除编译警告解决方法

更新时间:2016-03-10 17:26:23浏览次数:1+次

    用VS2010编译了VC6.0的项目,出现了很多错误。其中一个错误如下:


error C2440: “static_cast”: 无法从“void (__thiscall CChargerRd::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”

    从错误提示里可以明显看出,这个错误是函数的类型不匹配。从错误提示中可以看到,参数是一样的。所以问题不在函数的参数不匹配。然后看函数所在的类。我们可以知道,函数的类型和函数所在位置是没有关系的。这就好比,小明和小李出身在两个家庭,但是都是男生,更是人类。所以小明和小李是同类,出身位置不影响他们的类型。“英雄不问出处”,其实就是这个道理,既然都是英雄,那么都是英雄这一类人,和出身没有关系。
    所以,CChargerRd::和CWnd::两个作用域不会干扰我们找错误了。再继续看,就是两个函数的返回值了。一个是void,一个是LRESULT,这就很明显了,就是函数的返回值类型不同,导致两个函数类型不同了。
    提示说无法从void...转换到LRESULT...,这个表示我们错误的函数是void...,正确的是LRESULT...。分析到这里,你就知道如何处理了吧。把返回值类型为void的这个函数的声明和定义两个地方都改为LRESULT,然后在函数定义中,返回正确的返回值即可。
    好了,问题知道如何解决了。那么分析方法简单总结一下。
    看到错误的时候,首先不要惊慌。然后仔细看错误提示,然后逐个对比错误信息的描述(类型转换错误),从而找到问题点,然后双击这个错误提示跳转到错误的地方(VC、VS有效,其他的IDE可能不支持)。
    那么这个问题为什么会出现呢?之前不是好好的呢?怎么现在出现这个问题呢?
    VS2005前,对于MFC中的消息映射的写法要求比较低,所以消息响应函数可以是void类型的,然而在VS2005及以后的版本中,要求消息响应函数的返回值必须为LRESULT类型,而且对于消息的参数,不管用不用得上,必须写上WPARAM和LPARAM。
    同时在VS2010编译VC6.0项目时,出现很多警告信息。提示要使用_s版本的函数,如果你确保函数使用都是正确的,可以取消警告。可以看看《安全版函数、字符编码和预编译错误提示问题总结》和《安全开发生命周期SDL检查提高程序安全,但安全版函数并不会百分百安全》。
    对于警告确实有点烦人,你可以降低警告级别,这样,对于一些基本的C语言库函数的时候,就不会警告和提示使用安全版本的函数了。设置方法:打开项目的一个文件,切换当前文件为项目的文件,然后点击VS主菜单“项目”->“项目名+属性”->“配置属性”->“C/C++”->“常规”->把右侧的“警告等级”设置为“Level2(/W2)”,确定即可。