1、最常见的20种VC+编错误信息最常见的20种VC+编译错误信息最常见的20种VC+编译错误信息 1、fatal error C1010: unexpected end of file while looking for precompiled header directive。寻找预编译头文件路径时遇到了不该遇到的文件尾。解决方法:其一,包含正确路径的#include stdafx.h;其二,在*.cpp文件的Setting里面设置,C+选项中的分类 precompiled header,选择不包含头文件即可。2、fatal error C1083: Cannot open include f
2、ile: R.h: No such file or directory不能打开包含文件“R.h”:没有这样的文件或目录。3、error C2011: C: class type redefinition类“C”重定义。4、error C2018: unknown character 0xa3不认识的字符0xa3。(一般是汉字或中文标点符号)5、error C2057: expected constant expression希望是常量表达式。(一般出现在switch语句的case分支中)6、error C2065: IDD_MYDIALOG : undeclared identifier“ID
3、D_MYDIALOG”:未声明过的标识符。7、error C2082: redefinition of formal parameter bReset函数参数“bReset”在函数体中重定义。8、error C2143: syntax error: missing : before 句法错误:“”前缺少“;”。9、error C2146: syntax error : missing ; before identifier dc句法错误:在“dc”前丢了“;”。10、error C2196: case value 69 already used值69已经用过。(一般出现在switch语句的ca
4、se分支中)11、error C2509: OnTimer : member function not declared in CHelloView成员函数“OnTimer”没有在“CHelloView”中声明。12、error C2511: reset: overloaded member function void (int) not found in B重载的函数“void reset(int)”在类“B”中找不到。13、error C2555: B:f1: overriding virtual function differs from A:f1 only by return type
5、 or calling convention类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。14、error C2660: SetTimer : function does not take 2 parameters“SetTimer”函数不传递2个参数。15、warning C4035: f: no return value“f”的return语句没有返回值。16、warning C4553: = = : operator has no effect; did you intend =?没有效果的运算符“= =”;是否改为“=”?17、warning C4700: local
6、variable bReset used without having been initialized局部变量“bReset”没有初始化就使用。18、error C4716: CMyApp:InitInstance : must return a value“CMyApp:InitInstance”函数必须返回一个值。19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)20、error LNK2001: unresolved
7、external symbol public: virtual _ _thiscall C:C(void)连接时发现没有实现的外部符号(变量、函数等)。VC+ 函数,类函数调用过程VC+ 函数,类函数调用过程 这两天在研究在C+下实现的反射机制的可能性,的出的结论是可行的,具体参看我上一主题实现C+的反射实例。现在顺便把研究C+反射机制过程中函数的调用过程写一下。利用此特性写了一个通用的 函数转发器,可以调用任何的API函数。/ 初始化映射工厂InitializeMappingFactory();IMOKE_METHOD(NULL,&Messagebox,NULL,hello world.,你
8、好, MB_OK);在后面加任何东西都不会出错,而且很方便的绕过编译器的参数校验,比如:IMOKE_METHOD(NULL,&Messagebox,NULL,hello world.,你好, MB_OK,123456,7892737);都没有问题。好了跑题了,继续说正题:1. 无返回值的函数调用方法a. 参数为普通变量,即: int long ulong 和指针void SetValue(LONG f_Val)f_Val 获取方式为 mov eax, ebp + 8SetValue(xxx); 的调用方式为push xxxcall SetValueb. 参数为类对象,如:CStringvoid
9、 SetValue(std:string f_Val)f_Val 获取方式为 lea eax, ebp + 8SetValue(xxx);的调用方式为esp - 生成xxx的临时对象 std:stringcall SetValuec. 如果参数以引用方式调用void SetValue(std:string &f_Val)f_Val 获取方式为 mov eax, ebp + 8SetValue(xxx);的调用方式为lea eax, xxxpush eaxcall SetValued. 如果是类调用方法与之一样,区别是 ECX - 指向对象,具体如下所示void XXX:SetValue(LON
10、G f_Val)ecx - XXX对象f_Val 获取方式为 mov eax, ebp + 8a.SetValue(xxx); 调用方式为push xxxmov ecx,acall XXX:SetValuevoid XXX:SetValue(std:string f_Val)ecx - XXX对象f_Val 获取方式为 lea eax, ebp + 8a.SetValue(xxx);的调用方式为esp - 生成xxx的临时对象 std:stringmov ecx,acall XXX:SetValuevoid XXX:SetValue(std:string &f_Val)ecx - XXX对象f
11、_Val 获取方式为 mov eax, ebp + 8a.SetValue(xxx);的调用方式为lea eax, xxxpush eaxmov ecx,acall XXX:SetValue2.有返回值的函数调用方法同上,区别就在返回值的处理上a. 参数为普通变量,即: int long ulong 和指针LONG SetValue(LONG f_Val)f_Val 获取方式为 mov eax, ebp + 8b = SetValue(xxx); 的调用方式为push xxxcall SetValuemov b, eaxb. 参数为类对象,如:CStringstd:string SetValu
12、e(std:string f_Val)f_Val 获取方式为 lea eax, ebp + 8b = SetValue(xxx); 的调用方式为esp - 生成xxx的临时对象 std:stringlea eax, bpush eaxcall SetValuec. 如果参数以引用方式调用std:string SetValue(std:string &f_Val)f_Val 获取方式为 mov eax, ebp + 8b = SetValue(xxx); 的调用方式为lea eax, xxxpush eaxlea eax, bpush eaxcall SetValued. 如果是类调用方法与之一
13、样,区别是 ECX - 指向对象,具体如下所示LONG XXX:SetValue(LONG f_Val)ecx - XXX对象f_Val 获取方式为 mov eax, ebp + 8b = a.SetValue(xxx) 调用方式为push xxxmov ecx,acall XXX:SetValuemov b, eaxstd:string XXX:SetValue(std:string f_Val)ecx - XXX对象f_Val 获取方式为 lea eax, ebp + 8b = a.SetValue(xxx)的调用方式为esp - 生成xxx的临时对象 std:stringlea eax,
14、 bpush eaxmov ecx,acall XXX:SetValuestd:string XXX:SetValue(std:string &f_Val)ecx - XXX对象f_Val 获取方式为 mov eax, ebp + 8b = a.SetValue(xxx)的调用方式为lea eax, xxpush eaxlea eax, bpush eaxmov ecx,acall XXX:SetValueVC中编译、运行程序的知识点VC中编译、运行程序的知识点 1、Run-Time LibraryRun-Time Library是编译器提供的标准库,提供一些基本的库函数和系统调用。我们一般使
15、用的Run-Time Library是C Run-Time Libraries。当然也有Standard C+ libraries。C Run-Time Libraries实现ANSI C的标准库。VC安装目录的CRT目录有C Run-Time库的大部分源代码。C Run-Time Libraries有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。可以在project-settings-C/C+-Code Generation中选择Run-Time Library的版本。动态链接库版本:/MD Multithreaded DLL 使用导入库MSVCRT.L
16、IB/MDd Debug Multithreaded DLL 使用导入库MSVCRTD.LIB静态库版本:/ML Single-Threaded 使用静态库LIBC.LIB/MLd Debug Single-Threaded 使用静态库LIBCD.LIB/MT Multithreaded 使用静态库LIBCMT.LIB/MTd Debug Multithreaded 使用静态库LIBCMTD.LIBC Run-Time Library的标准io部分与操作系统的关系很密切,在Windows上,CRT的io部分代码只是一个包装,底层要用到操作系统内核kernel32.dll中的函数,在编译时使用导
17、入库kernel32.lib。这也就是为什么在嵌入式环境中,我们一般不能直接使用C标准库。在Linux环境当然也有C标准库,例如:ld -o output /lib/crt0.o hello.o -lc参数-lc就是在引用C标准库libc.a。猜一猜-lm引用哪个库文件?2、常见的编译参数VC建立项目时总会定义Win32。控制台程序会定义_CONSOLE,否则会定义_WINDOWS。Debug版定义_DEBUG,Release版定义NDEBUG与MFC DLL有关的编译常数包括:_WINDLL 表示要做一个用到MFC的DLL_USRDLL 表示做一个用户DLL(相对MFC扩展DLL而言)_AF
18、XDLL 表示使用MFC动态链接库_AFXEXT 表示要做一个MFC扩展DLL所以:Regular, statically linked to MFC _WINDLL,_USRDLLRegular, using the shared MFC DLL _WINDLL,_USRDLL,_AFXDLLExtension DLL _WINDLL,_AFXDLL,_AFXEXTCL.EXE编译所有源文件,LINK.EXE链接EXE和DLL,LIB.EXE产生静态库。3、subsystem和可执行文件的启动LINK的时候需要指定/subsystem,这个链接选项告诉Windows如何运行可执行文件。控制台
19、程序是/subsystem:console其它程序一般都是/subsystem:windows 将 subsystem 选成console后,Windows在进入可执行文件的代码前(如mainCRTStartup),就会产生一个控制台窗口。如果选择windows,操作系统就不产生console窗口,该类型应用程序的窗口由用户自己创建。可执行文件都有一个Entry Point,LINK时可以用/entry指定。缺省情况下,如果subsystem是“console”,Entry Point是 mainCRTStartup(ANSI)或wmainCRTStartuup(UNICODE),即:/sub
20、system:console /entry:mainCRTStartup (ANSI)/subsystem:console /entry:wmainCRTStartuup (UNICODE)mainCRTStartup 或 wmainCRTStartuup 会调用main或wmain。值得一提的是,在进入应用程序的Entry Point前,Windows的装载器已经做过C变量的初始化,有初值的全局变量拥有了它们的初值,没有初值的变量被设为0。如果subsystem是“windows”,Entry Point是WinMain(ANSI)或wWinMain(UINCODE),即:/subsyste
21、m:windows /entry:WinMainCRTStartup (ANSI)/sbusystem:windows /entry:wWinMainCRTStartup (UINCODE)WinMainCRTStartup 或 wWinMainCRTStartup 会调用 WinMain 或 wWinMain。这些入口点函数,在CRT目录都可以看到源代码,例如(为了简洁,我删除了原代码的一些条件编译):void mainCRTStartup(void)int mainret;/* Get the full Win32 version */_osver = GetVersion();_winm
22、inor = (_osver 8) & 0x00FF ;不 = _osver & 0x00FF ;_winver = (_winmajor 16) & 0x00FFFF ;#ifdef _MTif ( !_heap_init(1) ) /* initialize heap */#else /* _MT */if ( !_heap_init(0) ) /* initialize heap */#endif /* _MT */fast_error_exit(_RT_HEAPINIT); /* write message and die */#ifdef _MTif( !_mtinit() ) /*
23、 initialize multi-thread */fast_error_exit(_RT_THREAD); /* write message and die */#endif /* _MT */_try _ioinit(); /* initialize lowio */_acmdln = (char *)GetCommandLineA(); /* get cmd line info */_aenvptr = (char *)_crtGetEnvironmentStringsA(); /* get environ info */_setargv();_setenvp();_initenv =
24、 _environ;mainret = main(_argc, _argv, _environ);exit(mainret);_except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation() )_exit( GetExceptionCode() ); /* Should never reach here */ /* end of try - except */ 如果使用MFC框架,WinMain也会被埋藏在MFC库中(APPMODUL.CPP):extern C int WINAPI_tWinMain(HINSTANCE h
25、Instance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)/ call shared/exported WinMainreturn AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);如何在VC中实现淡入淡出的启动画面如何在VC中实现淡入淡出的启动画面 一日心血来潮,想给启动画面来个淡入淡出,于是去谷歌(google)查了半天,无果。但知道了AnimiateWindow 这个函数。好吧 ,让我们开始吧。首先,请在需要淡入淡出 窗口 的cpp文件或者stdafx
26、.h加入下列代码(注意要加在#include前面哦,否则没有作用哦)。#undef WINVER /取消原有版本定义,重新定义版本#define WINVER 0x5000 /为了使AnimateWindow函数可用#include 然后在相关文件分别加入OnCreate,OnClose,OnEraseBkgnd和OnTimer消息函数。记得在相关构析函数内加入 :SetTimer(1, 3000, NULL); /设定定时器1,定时3秒 OnCreate消息函数里添加淡入窗口或者背景位图代码BOOL CSplashWnd:OnCreate(LPCREATESTRUCT lpcs)Center
27、Window(); /窗口位于屏幕中心AnimateWindow(GetSafeHwnd(), 500, AW_BLEND); /淡入图片0.5秒return true; OnClose消息函数是添加淡出窗口或背景位图代码:void CSplashWnd:OnClose()AnimateWindow(GetSafeHwnd(), 500, AW_BLEND | AW_HIDE); /淡出图片0.5秒CWnd:OnClose(); OnEraseBkgnd消息函数是添加背景 位图 :BOOL CSplashWnd:OnEraseBkgnd(CDC *pDC)DDB mSplashBitmap;m
28、SplashBitmap.DisplayDDB(pDC, IDB_SPLASH); /显示位图资源IDB_SPLASHreturn true; OnTimer消息函数是添加定时关闭代码:void CSplashWnd:OnTimer(UINT nIDEvent)KillTimer(1); /关闭定时器1PostMessage(WM_CLOSE, 0, 0); /发送关闭窗口信息 是不是很简单,我看有些关于位图和窗口的淡入淡出很复杂,我刚学VC不久,看不懂。只好想出这简便的办法。Visual C+编译器常用选项设置Visual C+编译器常用选项设置 Matlab 是由Math Works 公司
29、于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。 但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC+则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。1、Matlab与VC混合编程的实现方法 Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法:(1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1