程序移植
Posted joeat1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序移植相关的知识,希望对你有一定的参考价值。
一、VS2010与VC++编译器的区别:
1.VS2010并不是针对C++的,C++只是它的一小部分,它更加关注.net平台程序开发(主要是C#、VB,C++/CLI(C++在.net下的语言)),而VC++6.0是专注与C++开发,或者说VC6只能开发C++程序,在VC6.0时期还没有.net
2.vc6对最新的C++的标准完全不支持,STL的支持也有缺陷,更加不支持可变参数宏,vc2010能够支持部分C++的特性,完全支持STL,同时支持可变参数宏
3.vs2010添加很多微软.NET的新特性,支持更多种类的资源文件,帮助文档也非常丰富,相较于vc6更加适合开发软件产品。vc6里面对COM的使用和后面的vc版本都有一些区别,这些可能导致以后在工作中遇到麻烦。另外,vc6对win7及其之后的版本支持并不好,很容易发生不兼容的情况。
4.默认编码不同,VC6默认是ansi,文件小速度慢。VS2010默认是unicode,文件大速度快。后者错误好找不用编译就出来了,bug少,更先进更强大,vc6有bug,但是编译快,文件相对较小
5.vs2010开发出来的程序可以自动根据特定的CPU翻译成高效的目标代码,VC6开发出来的程序,要想换成其它的CPU必须要重新开发
6.VC6的界面老旧,操作复杂,不完全符合C++的安全标准,但是是底层语言,与操作系统良好结合,使用广泛;VS2010可视化界面,安全可靠,支持C++标准,部署简
7.VS2010自带了winsock2库(第2版的库),每次都不用加Ws2_32.lib、MSDN online
移植的问题:
1.高级的编译器,在同一个基础下开发后,由于向前兼容,可以打开原始编译的工作平台
2.环境变量与宏设置
_WIN32_WINNT 与_WIN32_IE 设置冲突
设定的windows平台版本,与安装配置的ADK不相符合
#if _MSC_VER <= 1200 // MFC 6.0 or earlier
3.MFC出现的时候STL还没有成为C++的标准,所以MFC使用一套自己的模版库,比如CArray、CList、CMap等等,这些类型声明都在afximpl.h文件中。
4.为了显著增加CRT库的安全性,许多CRT函数都有了一个更安全的新版本,新版本和旧版本的区别就是新版本函数名多了一个_s后缀。鼓励使用安全切最新的版本,但是参数等变化很大,调整需要很多时间。
可以使用#pragma warning( disable : 4996 )预处理指令解除警告
5.新旧版本的MFC以及界面控件?中对ON_MESSAGE消息映射宏定义不同
旧版:
#define ON_MESSAGE(message, memberFxn) /
message, 0, 0, 0, AfxSig_lwl, /
(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM,
LPARAM))&memberFxn ,
新版:
#define ON_MESSAGE(message, memberFxn) /
message, 0, 0, 0, AfxSig_lwl, /
(AFX_PMSG)(AFX_PMSGW) /
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > /
(memberFxn)) ,
新的ON_MESSAGE宏使用C++的?static_cast?操作符代替了C类型的强制转换。
用户没有按照ON_MESSAGE宏的约定声明来定义消息响应函数,就会造成错误
旧版:
#define?ON_WM_NCHITTEST()?/?
?WM_NCHITTEST,?0,?0,?0,?AfxSig_wp,?/?
(AFX_PMSG)(AFX_PMSGW)(UINT(AFX_MSG_CALL?CWnd::*)(CPoint))&OnNcHitTest?,?
新版:
#define ON_WM_NCHITTEST() /
WM_NCHITTEST, 0, 0, 0, AfxSig_l_p, /
(AFX_PMSG)(AFX_PMSGW) /
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(CPoint) > (&ThisClass ::
OnNcHitTest)) ,
返回值类型由UINT改成了LRESULT,再加上static_cast的严格检查而出错
6.新的C++编译器不再支持默认类型的变量定义
7.for 语句的变量作用域问题
8.strchr(_tcschr)、strpbrk(_tcspbrk ??)、strrchr(_tcsrchr)和strstr(_tcsstr)这四个函数在VC6的CRT库中定义的返回值都是char *(TCHAR *),所以以前的代码通常是这样使用的:TCHAR *cp = _tcschr( pszPath, _T(‘//‘) ); //使用*cp,可以通过cp指针修改pszPath的内容这其实是一个“漏洞”,因为如果pszPath是const char(TCHAR) *字符串,那么就表示它不希望修改字符串的内容,但是调用strchr(_tcschr函数后就可以通过cp指针修改其内容了,这岂不荒谬?所有在新版本的CRT库中,这几个函数的返回值都改成const char *。
9.wchar_t *类型与USHORT *的转换错误
以上是关于程序移植的主要内容,如果未能解决你的问题,请参考以下文章