Vs2010与VC的区别

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 *的转换错误
阅读更多
换一批

没有更多推荐了,返回首页