1.编译错误C2065
1>c:¥documents and settings¥administrator¥桌面¥host_sp3¥selectdialog.cpp(62): error C2065: “i”: 未声明的标识符 解决办法,将
for (int i = 0; i < m_deviceList.size(); i++) {
m_ctlDevicelist.AddString(m_deviceList[i]); }
中变量i的定义放到函数体开头 int i;
for (i = 0; i < m_deviceList.size(); i++) {
m_ctlDevicelist.AddString(m_deviceList[i]); }
2.链接错误LNK2019
odbccp32.lib(dllload.obj) : error LNK2019: 无法解析的外部符号 __imp___vsnprintf,该符号在函数 _StringVPrintfWorkerA@20 中被引用
odbccp32.lib是在程序中对数据库操作时用到的,这个链接问题在使用静态DLL方式时才会遇到,如果使用共享DLL方式时不会出现,但是因为本程序需要使用静态DLL方式,所以继续尝试其他的解决方法。尝试在程序属性的连接器输入选项中添加附加依赖项odbccp32.lib,依然报错。于是在系统中搜索这个lib文件,最终找到了两种不同版本的odbccp32.lib。 VC6.0中文件信息:
C:¥Program Files¥Microsoft Visual Studio¥VC98¥Lib¥ODBCCP32.LIB
VS2010中文件信息:
C:¥Program Files¥Microsoft SDKs¥Windows¥v7.0A¥Lib¥odbccp32.lib
从文件信息中可以看出两个文件的版本大小都不同。在程序属性的连接器输入选项中添加附加依赖项C:¥Program Files¥Microsoft Visual Studio¥VC98¥Lib¥ODBCCP32.LIB,使用VC6.0版本的odbccp32.lib,编译连接成功。但是添加C:¥Program Files¥Microsoft SDKs¥Windows¥v7.0A¥Lib¥odbccp32.lib,使用VS2010版本错误依旧会出现。
从上面可以看出这个链接问题是VC6.0和VS2010中odbccp32.lib版本不同造成的,解决办法便是在程序属性的连接器输入选项中添加附加依赖项C:¥Program Files¥Microsoft Visual Studio¥VC98¥Lib¥ODBCCP32.LIB,使用VC6.0版本的odbccp32.lib。
3.编译错误C2664
编译后出现大量的C2664错误。
1>c:¥documents and settings¥administrator¥桌面¥host_sp3¥animal cognitiondlg.cpp(949): error C2664: “void ATL::CStringT
::Format(const unsigned short *,...)”: 不能将参数 1 从“const char [3]”转换为“const unsigned short *” 1> with 1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC 1> ]
与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
这个问题在VC6程序升级到VS2010时都会遇到,原因就是编码模式的不同。在VC6中,默认使用MBCS(Multi-Byte Character Set)编码,即多字节字符;而VC8、VC7默认的是Unicode编码。所以解决办法便是程序属性常规选项的字符集改为“Use Multi-Byte Character Set”即可。 字符基础(ASCII,DBCS,Unicode)
所有的 string 类都是以C-style字符串为基础的。C-style字符串是字符数组。所以我们先介绍字符类型。这里有3种编码模式对应3种字符类型。第一种编码类型是单子节字符集(single-byte character set or SBCS)。在这种编码模式下,所有的字符都只用一个字节表示。ASCII是SBCS。一个字节表示的0用来标志SBCS字符串的结束。
第二种编码模式是多字节字符集(multi-byte character set or MBCS)。一个MBCS编码包含一些一个字节长的字符,而另一些字符大于一个字节的长度。用在Windows里的MBCS包含两种字符类型,单字节字符(single-byte characters)和双字节字符
(double-byte characters)。由于Windows里使用的多字节字符绝大部分是两个字节长,所以MBCS常被用DBCS代替。
在DBCS编码模式中,一些特定的值被保留用来表明他们是双字节字符的一部分。例如,在Shift-JIS编码中(一个常用的日文编码模式),0x81-0x9f之间和0xe0-oxfc之间的值表示 "这是一个双字节字符,下一个子节是这个字符的一部分。"这样的值被称作 "leading bytes ",他们都大于0x7f。跟随在一个leading byte子节后面的字节被称作 "trail byte "。在DBCS中,trail byte可以是任意非0值。像SBCS一样,DBCS字符串的结束标志也是一个单字节表示的0。
第三种编码模式是Unicode。Unicode是一种所有的字符都使用两个字节编码的编码模式。Unicode字符有时也被称作宽字符,因为它比单子节字符宽(使用了更多的存储空间)。注意,Unicode不能被看作MBCS。MBCS的独特之处在于它的字符使用不同长度的字节编码。Unicode字符串使用两个字节表示的0作为它的结束标志。
单字节字符包含拉丁文字母表,accented characters及ASCII标准和DOS操作系统定义的图形字符。双字节字符被用来表示东亚及中东的语言。Unicode被用在COM及Windows NT操作系统内部。
你一定已经很熟悉单字节字符。当你使用char时,你处理的是单字节字符。双字节字符也用char类型来进行操作(这是我们将会看到的关于双子节字符的很多奇怪的地方之一)。Unicode字符用wchar_t来表示。Unicode字符和字符串常量用前缀L来表示。 4.警告
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) 产生这个错误的原因是原因是_WIN32_WINNT的版本定义太老,老的VC代码对_WIN32_WINNT的典型设置是: #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif
解决办法为在stdafx.h中添加宏定义。 #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0502 #endif
备注:必须在stdafx.h中所有#include 文件之前添加此代码。
5.警告C4018
>c:¥documents and settings¥administrator¥桌面¥host_sp3¥selectdialog.cpp(58): warning C4018: “<”: 有符号/无符号不匹配 出错代码 int i;
for (i = 0; i < m_deviceList.size(); i++) {
m_ctlDevicelist.AddString(m_deviceList[i]); }
出错原因分析:
m_deviceList是一个Vector容器,m_deviceList.size() 在容器说明中被定义为: unsigned int 类型, 而i是int类型,所以会出现:有符号/无符号不匹配 警告 解决办法:定义i为unsigned 类型后就可以了。
6.警告C4996
1>Animal Cognition.cpp(56): warning C4996: 'CWinApp::Enable3dControls': CWinApp::Enable3dControls is no longer needed. You should remove this call. 1> D:¥Program Files¥Microsoft Visual Studio
10.0¥VC¥atlmfc¥include¥afxwin.h(5344) : 参见“CWinApp::Enable3dControls”的声明 出错代码: #ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL #else
Enable3dControlsStatic(); // Call this when linking to MFC statically #endif
这两个函数的调用是旧的MFC版本对新版本的操作系统特性的支持,在新的(那个时候是新的)Windows 95平台上要这样调用一下才能使用新的Windows 3D样式的控件,否则就是老的Win 3.2样子的控件。对于新的MFC版本来说已经不需要再调用这两个函数了,可以用_MSC_VER对其隔离:
#if _MSC_VER <= 1200 // MFC 6.0 or earlier #ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL #else
Enable3dControlsStatic(); // Call this when linking to MFC statically #endif #endif
7.警告C4996
1>Animal CognitionDlg.cpp(207): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> D:¥Program Files¥Microsoft Visual Studio 10.0¥VC¥include¥string.h(105) : 参见“strcpy”的声明
这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷
上一篇:VC60编程技巧集_vc代码
下一篇:迷失其实是懒的借口