vc++错误提示,vc++出错
1.未解决的外部定义错误
xyView.obj:错误LNK2001:未解析的外部符号 public:_ this call cmyo crinfo:cmyo crinfo(void)(?0CMyOCRInfo@@QAE@XZ)
可能是因为构造函数没有实现代码。
2.释放HBITMAP句柄失败会导致无法创建位图的问题。
2004.8.17
HBITMAP句柄没有及时释放,当创建的位图数量达到30个时,出现8号错误,即内存不足。
3.调试窗口中的输出信息。
跟踪;
4.如果使用向导创建新类时只有一个自定义类型,这可能是因为。clw文件不生成,直接生成。
5.注意变量的类型范围,强制转换可能导致数据溢出;以下示例将导致无限循环:
for(字节I=0;i i ){
.
}
注意:因为字节类型的表示范围是:0-255,所以I永远不能大于255,导致死锁。
6.不包括stdafx.h引起的错误:
致命错误C1010:查找预编译头指令时出现意外的文件结尾
只需将stdafx.h文件包含在。cpp文件。
7.避免重复包含头文件。
# IFN def _ INC _ PUBLIC _ H _ 32564987132178947
# define _ INC _ PUBLIC _ H _ 32564987132178947
//中间写代码
.
#endif
注意:#ifndef可以改成#if!清晰的
8.存在重复定义错误,例如:
d:/program files/Microsoft visual studio/vc98/include/dbdaoint . h(33):错误c 2011:“EditModeEnum”:“enum”类型重新定义
检查是否在all中定义了include stdafx.h。h文件并删除它。
全部搜索stdafx。cpp文件查看stdafx.h文件是否重复包含,删除重复的。
另一个例子是:
refimagedll . obj:error lnk 2005: int _ _ cdecl getcamarefimage indexofid 1(class CArray class CCameraRefImage,class CCameraRefImage,int)(?getcamerarefimageindexofid 1 @ @ YAHAAV?$ CArray @ VCCameraRefImage @ @ V1 @ @ @ H @ Z)已经在InterFaceFile.obj中定义
因为函数是在。h文件,并且是完全实现的,那么包含在多个文件中就会出现重复定义错误。解决方法是
将函数定义为inline,这样它就不再是一个函数,而是直接被一段代码替换,例如:
int inline GetAge(){
返回10;
}
9.不完整的类定义,例如:
refimagedll.h(14):错误C2236:意外的“类”CRefImageListDll
通常,该文件包含不完整的类定义,例如:
类别a{
int age
}
后面少了一个分号,应该改成:
a级
int age
};
10.纯虚拟类不能生成实例,例如:
d:/program files/Microsoft visual studio/vc98/MFC/include/afx templ . h(201):错误c 2259:“CKernel”:由于以下成员,无法实例化抽象类:
如下所示:
a级
公共:
虚拟void SetValue(int I)=NULL;
}
b类:公共a{
私人:
int m _ iID
公共:
}
在这种情况下,B也无法实例化,因为B中没有SetValue()方法,但可以通过在B中实现SetValue()方法来解决。
11.重复发布导致的问题
从代码0x77f9193c调用的用户断点
上面的原因是一个类的成员被释放了,最后因为其成员已经被释放(成员被释放但未设置为NULL)而析构该类时出错。
12.试图执行系统不支持的操作。
请检查当前窗口模块是否使用了不属于它的其他资源。
13.Dll中调用对话框等资源的方法(如何在动态链接库中显示对话框)2006.7.24
将以下代码添加到动态链接库的显示对话框函数中:
AFX _ MANAGE _ STATE(AfxGetStaticModuleState());
如果需要导出对话框的对象并在外部显示,可以重载DoModal()方法,在方法中添加afx _ manage _ state(afxgetstaticmodulestate());
14.动态链接库和静态链接库的混合使用。
症状:使用LoadLibrary()加载动态链接库时,返回0,函数不成功。调用GetLastError()返回结果126。MSDN说:
找不到指定的模块。错误_模块_未找到
发现这个动态链接库以静态的方式调用另一个链接库(B),另一个链接库以静态的方式调用另一个动态链接库(C),但是C并没有复制到程序所在的目录,所以无法正常加载。
15.宏定义导致系统错误。
甚至三个错误:
未声明变量时,忽略“unsigned char”左侧的
错误C2143:语法错误:缺少“;”在“常数”之前
错误c 2106:“=”:左操作数必须是左值
代码如下:
byte R=(byte)(AColor0x ff);
按常理应该没问题,但是因为R是在函数库里定义的,所以R不能作为变量。
16.16号。GetDocument()函数的调试版本可用,但发布版本无法使用,说明该函数没有实现代码。
检查。h文件末尾有以下代码:
# ifndef _ DEBUG//LCD model view . CPP中的调试版本
内联CXXXDoc* CXXXView:GetDocument()
{ return(c xxxdoc *)m _ p document;}
#endif
原则:对于从未被调用过的函数,可以没有实现代码。如果有调用,你必须有它的实现代码。微软使用宏定义来区分发布版本和调试版本。
17.VC环境下FindFile无法用于文件搜索的问题(刘东言发现2007年3月1日陆宽解决)
在VC的集成开发环境下,点击搜索文件按钮,VC崩溃。
检查注册表项:HKEY _当前_用户/软件/微软/dev studio/6.0/search old/fif _ folders。
发现其值是不存在的目录,导致崩溃。解决方法是清除键值。
18.记住使用函数的参数(2007年3月28日)
例如,错误c2220:警告被视为错误-没有生成目标文件
或者:警告c 4100:“aparamcount”:未引用的形参
9.VC项目每次都重新编译(2007年4月18日被王政发现)
问题:每次点击F7、F5或Ctrl+F5,所有VC项目都会被编译。
解决方法:发现系统时间早于项目创建时间,导致这个问题。
20.DLL出口法(2007年6月1日)
1.在def文件中导出,格式为:Function @n例如:ShowName @1
2.将_declspec(dllexport)标识符直接添加到函数声明中
注意,第一个只能导出函数,不能导出类,而第二个可以导出函数和类。
第二种方法有一个问题:只能提供给VC程序进行静态调用,因为导出的函数名都添加了参数的信息,比如“?ShowName@@YAXXZ "
解决方法是在它的声明前面加上extern C ,例如:extern C _ declspec(dll export)void showname()
综上所述,第二种方法既可以支持静态调用,也可以支持动态调用,还可以支持类导出。
参见示例附件。
21.修改系统默认调试器(2007.6.29)
Win2000:
注册表:HKEY _本地_机器/软件/微软/win nt/当前版本/aedebug
c:/Program Files/Visual Studio/Common/MSDev/Bin/MSDev . exe -p % LD-e % LD
2.在动态库中析构CString函数时出错(2008年2月25日)
说明:CString作为参数,主程序用调试版编译,DLL用Release编译。
析构CString时出错。
解决方法是用Debug或Release编译主程序和DLL。
23.程序每次在VC环境下运行,都要求重新编译(2008 . 2 . 28)
问题:不管是不是全编的,都有以下提示:
一个或多个文件过期或不存在。
需要构建这些文件:
/公司/其他项目/打印项目/print mbw _ workspace/execute/print mbw . exe。/Release/MyImageWnd.obj
更多文件.
您想要构建它们吗?
解决方法:原因是代码文件的日期晚于当前日期,导致编译器认为obj文件不是最新的,需要重新编译。解决方案是将这些文件的修改日期更改为当前日期。
24.类成员函数指针计算不准确(陆宽2008年5月30日发现)
typedef char(cmy class:* my func)();
my func * pFuncList=new my func[16];
这段代码应该创建一个MyFunc类型的类成员函数指针数组,长度为16,实际长度为64字节。但结果是生成了一个实际长度为16字节的数组。将类型char替换为void,实际长度变为0字节,实际长度为64字节,实际长度为128字节。也就是说,vc编译器把返回值的长度误认为是函数指针的长度。但是sizeof(MyFunc)确实等于4。
如果用普通函数指向类型,从类型中去掉CMyClass:就万事大吉了。
我觉得这是vc编译器的一个严重bug。但是这种语法一般只在框架代码中使用,很少出现在实际代码中,所以很难发现bug。
解决:
分配一个普通的int类型数组,并将返回的数组强制转换为MyFunc * type。
my func * pFuncList=(my func *)new int[16];
不知道这个bug在新版VC中有没有解决?
25.类成员函数指针的大小(陆宽2008年6月19日发现)
类CTestParentClass{
公共:
CTestParentClass(){}
虚拟void调用()=NULL
};
类CTestChildClass:public CTestParentClass,CString {
公共:
CTestChildClass(){}
虚拟void调用(){
void(CTestChildClass:* p)()=my func;
TRACE(size=%d/n ,sizeof(p));
}
};
调用Call函数,查看指针是否为8字节长。