最常见的20种VC++编错误信息.docx

上传人:b****5 文档编号:5659294 上传时间:2022-12-30 格式:DOCX 页数:14 大小:27.50KB
下载 相关 举报
最常见的20种VC++编错误信息.docx_第1页
第1页 / 共14页
最常见的20种VC++编错误信息.docx_第2页
第2页 / 共14页
最常见的20种VC++编错误信息.docx_第3页
第3页 / 共14页
最常见的20种VC++编错误信息.docx_第4页
第4页 / 共14页
最常见的20种VC++编错误信息.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

最常见的20种VC++编错误信息.docx

《最常见的20种VC++编错误信息.docx》由会员分享,可在线阅读,更多相关《最常见的20种VC++编错误信息.docx(14页珍藏版)》请在冰豆网上搜索。

最常见的20种VC++编错误信息.docx

最常见的20种VC++编错误信息

最常见的20种VC++编译错误信息

最常见的20种VC++编译错误信息 1、fatalerrorC1010:

unexpectedendoffilewhilelookingforprecompiledheaderdirective。

寻找预编译头文件路径时遇到了不该遇到的文件尾。

解决方法:

其一,包含正确路径的#include"stdafx.h";

其二,在*.cpp文件的Setting里面设置,C++选项中的分类precompiledheader,选择不包含头文件即可。

2、fatalerrorC1083:

Cannotopenincludefile:

'R…….h':

Nosuchfileordirectory

不能打开包含文件“R…….h”:

没有这样的文件或目录。

3、errorC2011:

'C……':

'class'typeredefinition

类“C……”重定义。

4、errorC2018:

unknowncharacter'0xa3'

不认识的字符'0xa3'。

(一般是汉字或中文标点符号)

5、errorC2057:

expectedconstantexpression

希望是常量表达式。

(一般出现在switch语句的case分支中)

6、errorC2065:

'IDD_MYDIALOG':

undeclaredidentifier

“IDD_MYDIALOG”:

未声明过的标识符。

7、errorC2082:

redefinitionofformalparameter'bReset'

函数参数“bReset”在函数体中重定义。

8、errorC2143:

syntaxerror:

missing':

'before'{'

句法错误:

“{”前缺少“;”。

9、errorC2146:

syntaxerror:

missing';'beforeidentifier'dc'

句法错误:

在“dc”前丢了“;”。

10、errorC2196:

casevalue'69'alreadyused

值69已经用过。

(一般出现在switch语句的case分支中)

11、errorC2509:

'OnTimer':

memberfunctionnotdeclaredin'CHelloView'

成员函数“OnTimer”没有在“CHelloView”中声明。

12、errorC2511:

'reset':

overloadedmemberfunction'void(int)'notfoundin'B'

重载的函数“voidreset(int)”在类“B”中找不到。

13、errorC2555:

'B:

:

f1':

overridingvirtualfunctiondiffersfrom'A:

:

f1'onlybyreturntypeorcallingconvention

类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。

14、errorC2660:

'SetTimer':

functiondoesnottake2parameters

“SetTimer”函数不传递2个参数。

15、warningC4035:

'f……':

noreturnvalue

“f……”的return语句没有返回值。

16、warningC4553:

'==':

operatorhasnoeffect;didyouintend'='?

没有效果的运算符“==”;是否改为“=”?

17、warningC4700:

localvariable'bReset'usedwithouthavingbeeninitialized

局部变量“bReset”没有初始化就使用。

18、errorC4716:

'CMyApp:

:

InitInstance':

mustreturnavalue

“CMyApp:

:

InitInstance”函数必须返回一个值。

19、LINK:

fatalerrorLNK1168:

cannotopenDebug/P1.exeforwriting

连接错误:

不能打开P1.exe文件,以改写内容。

(一般是P1.Exe还在运行,未关闭)

20、errorLNK2001:

unresolvedexternalsymbol"public:

virtual__thiscallC……:

:

~C……(void)"

连接时发现没有实现的外部符号(变量、函数等)。

VC++函数,类函数调用过程

VC++函数,类函数调用过程 这两天在研究在C++下实现的反射机制的可能性,的出的结论是可行的,具体参看我上一主题实现C++的反射实例。

现在顺便把研究C++反射机制过程中函数的调用过程写一下。

利用此特性写了一个通用的函数转发器,可以调用任何的API函数。

//初始化映射工厂 

InitializeMappingFactory();

IMOKE_METHOD(NULL,&Messagebox,NULL,"helloworld.","你好",MB_OK);

在后面加任何东西都不会出错,而且很方便的绕过编译器的参数校验,比如:

IMOKE_METHOD(NULL,&Messagebox,NULL,"helloworld.","你好",MB_OK,"123456","7892737");

都没有问题。

好了跑题了,继续说正题:

1.无返回值的函数调用方法 

a.参数为普通变量,即:

intlongulong和指针 

voidSetValue(LONGf_Val) 

f_Val获取方式为moveax,[ebp+8] 

}

SetValue(xxx);的调用方式为 

pushxxx 

callSetValue

b.参数为类对象,如:

CString 

voidSetValue(std:

:

stringf_Val) 

f_Val获取方式为leaeax,[ebp+8] 

}

SetValue(xxx);的调用方式为 

esp->生成xxx的临时对象std:

:

string 

callSetValue

c.如果参数以引用方式调用

voidSetValue(std:

:

string&f_Val) 

f_Val获取方式为moveax,[ebp+8] 

}

SetValue(xxx);的调用方式为 

leaeax,xxx 

pusheax 

callSetValue

d.如果是类调用方法与之一样,区别是ECX->指向对象,具体如下所示

voidXXX:

:

SetValue(LONGf_Val) 

ecx->XXX对象 

f_Val获取方式为moveax,[ebp+8] 

}

a.SetValue(xxx);调用方式为 

pushxxx 

movecx,a 

callXXX:

:

SetValue

voidXXX:

:

SetValue(std:

:

stringf_Val) 

ecx->XXX对象 

f_Val获取方式为leaeax,[ebp+8] 

}

a.SetValue(xxx);的调用方式为 

esp->生成xxx的临时对象std:

:

string 

movecx,a 

callXXX:

:

SetValue

voidXXX:

:

SetValue(std:

:

string&f_Val) 

ecx->XXX对象 

f_Val获取方式为moveax,[ebp+8] 

}

a.SetValue(xxx);的调用方式为 

leaeax,xxx 

pusheax 

movecx,a 

callXXX:

:

SetValue

2.有返回值的函数调用方法同上,区别就在返回值的处理上

a.参数为普通变量,即:

intlongulong和指针 

LONGSetValue(LONGf_Val) 

f_Val获取方式为moveax,[ebp+8] 

}

b=SetValue(xxx);的调用方式为 

pushxxx 

callSetValue 

movb,eax

b.参数为类对象,如:

CString 

std:

:

stringSetValue(std:

:

stringf_Val) 

f_Val获取方式为leaeax,[ebp+8] 

}

b=SetValue(xxx);的调用方式为 

esp->生成xxx的临时对象std:

:

string 

leaeax,b 

pusheax 

callSetValue

c.如果参数以引用方式调用

std:

:

stringSetValue(std:

:

string&f_Val) 

f_Val获取方式为moveax,[ebp+8] 

}

b=SetValue(xxx);的调用方式为 

leaeax,xxx 

pusheax 

leaeax,b 

pusheax 

callSetValue

d.如果是类调用方法与之一样,区别是ECX->指向对象,具体如下所示

LONGXXX:

:

SetValue(LONGf_Val) 

ecx->XXX对象 

f_Val获取方式为moveax,[ebp+8] 

}

b=a.SetValue(xxx)调用方式为 

pushxxx 

movecx,a 

callXXX:

:

SetValue 

movb,eax

std:

:

stringXXX:

:

SetValue(std:

:

stringf_Val) 

ecx->XXX对象 

f_Val获取方式为leaeax,[ebp+8] 

}

b=a.SetValue(xxx)的调用方式为 

esp->生成xxx的临时对象std:

:

string 

leaeax,b 

pusheax 

movecx,a 

callXXX:

:

SetValue

std:

:

stringXXX:

:

SetValue(std:

:

string&f_Val) 

ecx->XXX对象 

f_Val获取方式为moveax,[ebp+8] 

}

b=a.SetValue(xxx)的调用方式为 

leaeax,xx 

pusheax 

leaeax,b 

pusheax 

movecx,a 

callXXX:

:

SetValue 

VC中编译、运行程序的知识点

VC中编译、运行程序的知识点 1、Run-TimeLibrary 

Run-TimeLibrary是编译器提供的标准库,提供一些基本的库函数和系统调用。

 

我们一般使用的Run-TimeLibrary是CRun-TimeLibraries。

当然也有StandardC++libraries。

 

CRun-TimeLibraries实现ANSIC的标准库。

VC安装目录的CRT目录有CRun-Time库的大部分源代码。

 

CRun-TimeLibraries有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。

 

可以在"project"-"settings"-"C/C++"-"CodeGeneration"中选择Run-TimeLibrary的版本。

动态链接库版本:

 

/MDMultithreadedDLL使用导入库MSVCRT.LIB 

/MDdDebugMultithreadedDLL使用导入库MSVCRTD.LIB

静态库版本:

 

/MLSingle-Threaded使用静态库LIBC.LIB 

/MLdDebugSingle-Threaded使用静态库LIBCD.LIB 

/MTMultithreaded使用静态库LIBCMT.LIB 

/MTdDebugMultithreaded使用静态库LIBCMTD.LIB

CRun-TimeLibrary的标准io部分与操作系统的关系很密切,在Windows上,CRT的io部分代码只是一个包装,底层要用到操作系统内核kernel32.dll中的函数,在编译时使用导入库kernel32.lib。

这也就是为什么在嵌入式环境中,我们一般不能直接使用C标准库。

 

在Linux环境当然也有C标准库,例如:

 

ld-ooutput/lib/crt0.ohello.o-lc 

参数"-lc"就是在引用C标准库libc.a。

猜一猜"-lm"引用哪个库文件?

2、常见的编译参数 

VC建立项目时总会定义"Win32"。

控制台程序会定义"_CONSOLE",否则会定义"_WINDOWS"。

Debug版定义"_DEBUG",Release版定义"NDEBUG"

与MFCDLL有关的编译常数包括:

 

_WINDLL表示要做一个用到MFC的DLL 

_USRDLL表示做一个用户DLL(相对MFC扩展DLL而言) 

_AFXDLL表示使用MFC动态链接库 

_AFXEXT表示要做一个MFC扩展DLL 

所以:

 

Regular,staticallylinkedtoMFC_WINDLL,_USRDLL 

Regular,usingthesharedMFCDLL_WINDLL,_USRDLL,_AFXDLL 

ExtensionDLL_WINDLL,_AFXDLL,_AFXEXT

CL.EXE编译所有源文件,LINK.EXE链接EXE和DLL,LIB.EXE产生静态库。

3、subsystem和可执行文件的启动 

LINK的时候需要指定/subsystem,这个链接选项告诉Windows如何运行可执行文件。

 

控制台程序是/subsystem:

"console" 

其它程序一般都是/subsystem:

"windows"

将subsystem选成"console"后,Windows在进入可执行文件的代码前(如mainCRTStartup),就会产生一个控制台窗口。

 

如果选择"windows",操作系统就不产生console窗口,该类型应用程序的窗口由用户自己创建。

可执行文件都有一个EntryPoint,LINK时可以用/entry指定。

缺省情况下,如果subsystem是“console”,EntryPoint是mainCRTStartup(ANSI)或wmainCRTStartuup(UNICODE),即:

 

/subsystem:

"console"/entry:

"mainCRTStartup"(ANSI) 

/subsystem:

"console"/entry:

"wmainCRTStartuup"(UNICODE) 

mainCRTStartup或wmainCRTStartuup会调用main或wmain。

 

值得一提的是,在进入应用程序的EntryPoint前,Windows的装载器已经做过C变量的初始化,有初值的全局变量拥有了它们的初值,没有初值的变量被设为0。

如果subsystem是“windows”,EntryPoint是WinMain(ANSI)或wWinMain(UINCODE),即:

 

/subsystem:

"windows"/entry:

"WinMainCRTStartup"(ANSI) 

/sbusystem:

"windows"/entry:

"wWinMainCRTStartup"(UINCODE) 

WinMainCRTStartup或wWinMainCRTStartup会调用WinMain或wWinMain。

这些入口点函数,在CRT目录都可以看到源代码,例如(为了简洁,我删除了原代码的一些条件编译):

voidmainCRTStartup(void) 

intmainret;

/*GetthefullWin32version*/ 

_osver=GetVersion(); 

_winminor=(_osver>>8)&0x00FF; 

不=_osver&0x00FF; 

_winver=(_winmajor<<8)+_winminor; 

_osver=(_osver>>16)&0x00FFFF;

#ifdef_MT 

if(!

_heap_init

(1))/*initializeheap*/ 

#else/*_MT*/ 

if(!

_heap_init(0))/*initializeheap*/ 

#endif/*_MT*/ 

fast_error_exit(_RT_HEAPINIT);/*writemessageanddie*/

#ifdef_MT 

if(!

_mtinit())/*initializemulti-thread*/ 

fast_error_exit(_RT_THREAD);/*writemessageanddie*/ 

#endif/*_MT*/

__try{ 

_ioinit();/*initializelowio*/ 

_acmdln=(char*)GetCommandLineA();/*getcmdlineinfo*/ 

_aenvptr=(char*)__crtGetEnvironmentStringsA();/*getenvironinfo*/ 

_setargv(); 

_setenvp(); 

__initenv=_environ; 

mainret=main(__argc,__argv,_environ); 

exit(mainret); 

__except(_XcptFilter(GetExceptionCode(),GetExceptionInformation())) 

_exit(GetExceptionCode());/*Shouldneverreachhere*/ 

}/*endoftry-except*/ 

}如果使用MFC框架,WinMain也会被埋藏在MFC库中(APPMODUL.CPP):

extern"C"intWINAPI

_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance, 

LPTSTRlpCmdLine,intnCmdShow) 

//callshared/exportedWinMain 

returnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow); 

}

如何在VC中实现淡入淡出的启动画面

如何在VC中实现淡入淡出的启动画面 一日心血来潮,想给启动画面来个淡入淡出,于是去谷歌(google)查了半天,无果。

但知道了AnimiateWindow这个函数。

好吧,让我们开始吧。

首先,请在需要淡入淡出窗口的cpp文件或者stdafx.h加入下列代码(注意要加在#include前面哦,否则没有作用哦)。

#undefWINVER//取消原有版本定义,重新定义版本 

#defineWINVER0x5000//为了使AnimateWindow函数可用

#include 

   然后在相关文件分别加入OnCreate,OnClose,OnEraseBkgnd和OnTimer消息函数。

记得在相关构析函数内加入:

SetTimer(1,3000,NULL);//设定定时器1,定时3秒 

  OnCreate消息函数里添加淡入窗口或者背景位图代码

BOOLCSplashWnd:

:

OnCreate(LPCREATESTRUCTlpcs) 

CenterWindow();//窗口位于屏幕中心 

AnimateWindow(GetSafeHwnd(),500,AW_BLEND);//淡入图片0.5秒

returntrue; 

  OnClose消息函数是添加淡出窗口或背景位图代码:

voidCSplashWnd:

:

OnClose() 

AnimateWindow(GetSafeHwnd(),500,AW_BLEND|AW_HIDE);//淡出图片0.5秒

CWnd:

:

OnClose(); 

  OnEraseBkgnd消息函数是添加背景位图:

BOOLCSplashWnd:

:

OnEraseBkgnd(CDC*pDC) 

DDBmSplashBitmap; 

mSplashBitmap.DisplayDDB(pDC,IDB_SPLASH);//显示位图资源IDB_SPLASH

returntrue; 

 OnTimer消息函数是添加定时关闭代码:

voidCSplashWnd:

:

OnTimer(UINTnIDEvent) 

KillTimer

(1);//关闭定时器1 

PostMessage(WM_CLOSE,0,0);//发送关闭窗口信息 

  是不是很简单,我看有些关于位图和窗口的淡入淡出很复杂,我刚学VC不久,看不懂。

只好想出这简便的办法。

VisualC++编译器常用选项设置

VisualC++编译器常用选项设置  Matlab是由MathWorks公司于1984年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。

其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。

    但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。

1、Matlab与VC混合编程的实现方法       Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。

一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法:

(1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。

具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1