vs2010/vc6.0中遇到的各种问题收集及解决方法

时间:2022-09-08 11:21:17

http://m.blog.csdn.net/blog/EbowTang/37767509

2014-7-14阅读226 评论0

本文目的:整理与收集!解决方法一般来自于网络!有些问题可能不是在vs2010中发生的(有的是在vc6.0)!

参考资源:《精通MFC编程》,“谷歌大神”

问题一:error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)...

不能转换void (_thiscall CMainFrame::*)(void)to LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)2014-07-13 11:35开发平台由VC6.0升级至VS2010,需要将原有的项目迁移,可能碰到类似错误:
error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMainFrame::* )(void)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'

VS2010对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2010下编译不通过

ON_MESSAGE(WM_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)”
在匹配目标类型的范围内没有具有该名称的函数

解决方法如下:
首先,把原来的消息函数返回值类型改为LRESULT,函数内可以随便写个return TRUE; 然后消息函数的参数必须改写成(WPARAM wParam,LPARAM lParam)而不论这两个参数是否用得到;最后,消息映射如ON_MESSAGE(WM_message,& OnMyMessage)


问题二:编译链接时提示找不到预编译头

通常,直接向工程文件里加入一个.cpp 源文件后,编译链接时总是提示找不到预编译头,此时就需要在源文件头部添加如下的包含语句:

#include "stdafx.h" 说明  在添加stdafx.h包含语句后,最好也加上应用头文件的包含语句。


问题三:不能通过双击成员变量或成员函数转移至变量或函数定义的位置

在实际开发中,也常常遇到如下的情况。向类中添加的成员变量或成员函数不能在ClassView中显示。不能通过双击成员变量或成员函数转移至变量或函数定义的位置。一般情况下,在输入一个类的对象后,按下“.”后将会出现该类的成员变量和成员函数;或者当输入一个类对象或结构的指针时,按下“>”后也将会出现该类的成员变量和成员函数。这也是Visual C++编译器所固有的功能,可是会发现这两种功能经常不能使用。当出现上述几种情况时,首先关闭工程,然后删除工程文件夹下的.ncb 文件,最后打开工程重新编译即可恢复原有的功能。


问题四.在vc6.0中如何干净的删除类

通常,需要从工程中删除一个不再使用的类,删除类的方法很有讲究,如果不能彻底地删除,将会产生莫名其妙的错误。一般可以按照如下的方法进行。首先在工作区的FileView中选中该类的.h 和.cpp 文件,按Delete键删除,然后在工程的文件夹下将这两个文件删掉,并且把.clw文件也删除(如果不删除此文件,也可以再次运行ClassWizard,这时出现“是否移走该类”的提示,选择remove也可以)即可。在删除.clw文件文件之后,再次使用类向导时将会弹出“.clw 文件不存在”的提示,这时可以按照弹出的提示从工程中的文件创建一个.clw文件文件即可。另外,还需要把引用该类头文件的包含语句删除,否则也将出现错误。


问题五:类的消失

实践中,经常会发现在对某个类作出一系列的操作(如添加成员、响应消息等)后该类竟然从ClassView中消失了,可是并没有任何与该类相关的文件删除操作。其实这是Visual C++的一个bug。遇到这种情况时,一般只需要打开该类对应的头文件,将其类名改一下,然后再恢复这个类的类名称即可,或者在定义类的“class”以及继承类型的关键字之间,随意敲上一个空格或者删除一个空格,也可以达到同样的效果。


问题六:25960指的是什么?怎么得到的?

完整例子为:

// CTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	char str[]="hello";
   char *p1=str;
	short int *p2=reinterpret_cast<short int*>(p1);//强制类型转换

	cout<<*str<<endl;//h
	cout<<str[0]<<str[1]<<endl;//he
	cout<<str<<endl;//hello

	cout<<p1<<endl;//hello
	cout<<*p1<<endl;//h

	cout<<p2<<endl;//
	cout<<*p2<<endl;//25960
	
	cout<<sizeof( short int )<<endl;//2
	cout<<sizeof(char)<<endl;//1
	system("pause");
	return 0;
}
vs2010/vc6.0中遇到的各种问题收集及解决方法

未得到解决.....................