Vs2010与VC的区别
VS2010與VC++編譯器的區(qū)別:
1.VS2010并不是針對(duì)C++的,C++只是它的一小部分,它更加關(guān)注.net平臺(tái)程序開(kāi)發(fā)(主要是C#、VB,C++/CLI(C++在.net下的語(yǔ)言)),而VC++6.0是專注與C++開(kāi)發(fā),或者說(shuō)VC6只能開(kāi)發(fā)C++程序,在VC6.0時(shí)期還沒(méi)有.net
2.vc6對(duì)最新的C++的標(biāo)準(zhǔn)完全不支持,STL的支持也有缺陷,更加不支持可變參數(shù)宏
? vc2010能夠支持部分C++的特性,完全支持STL,同時(shí)支持可變參數(shù)宏
3.vs2010添加很多微軟.NET的新特性,支持更多種類的資源文件,幫助文檔也非常豐富,相較于vc6更加適合開(kāi)發(fā)軟件產(chǎn)品。
vc6里面對(duì)COM的使用和后面的vc版本都有一些區(qū)別,這些可能導(dǎo)致以后在工作中遇到麻煩。另外,vc6對(duì)win7及其之后的版本支持并不好,很容易發(fā)生不兼容的情況。
4.默認(rèn)編碼不同,VC6默認(rèn)是ansi,文件小速度慢。VS2010默認(rèn)是unicode,文件大速度快
后者錯(cuò)誤好找不用編譯就出來(lái)了,bug少,更先進(jìn)更強(qiáng)大,vc6有bug,但是編譯快,文件相對(duì)較小
5.vs2010開(kāi)發(fā)出來(lái)的程序可以自動(dòng)根據(jù)特定的CPU翻譯成高效的目標(biāo)代碼,VC6開(kāi)發(fā)出來(lái)的程序,要想換成其它的CPU必須要重新開(kāi)發(fā)
6.VC6的界面老舊,操作復(fù)雜,不完全符合C++的安全標(biāo)準(zhǔn),但是是底層語(yǔ)言,與操作系統(tǒng)良好結(jié)合,使用廣泛;VS2010可視化界面,安全可靠,支持C++標(biāo)準(zhǔn),部署簡(jiǎn)
7.VS2010自帶了winsock2庫(kù)(第2版的庫(kù)),每次都不用加Ws2_32.lib
MSDN online
移植的問(wèn)題:
1.高級(jí)的編譯器,在同一個(gè)基礎(chǔ)下開(kāi)發(fā)后,由于向前兼容,可以打開(kāi)原始編譯的工作平臺(tái)
2.環(huán)境變量與宏設(shè)置
_WIN32_WINNT 與_WIN32_IE 設(shè)置沖突
設(shè)定的windows平臺(tái)版本,與安裝配置的ADK不相符合
#if _MSC_VER <= 1200 // MFC 6.0 or earlier
3.MFC出現(xiàn)的時(shí)候STL還沒(méi)有成為C++的標(biāo)準(zhǔn),所以MFC使用一套自己的模版庫(kù),比如CArray、CList、CMap等等,這些類型聲明都在afximpl.h文件中。
4.為了顯著增加CRT庫(kù)的安全性,許多CRT函數(shù)都有了一個(gè)更安全的新版本,新版本和舊版本的區(qū)別就是新版本函數(shù)名多了一個(gè)_s后綴。鼓勵(lì)使用安全切最新的版本,但是參數(shù)等變化很大,調(diào)整需要很多時(shí)間。
? 可以使用#pragma warning( disable : 4996 )預(yù)處理指令解除警告
5.新舊版本的MFC以及界面控件?中對(duì)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類型的強(qiáng)制轉(zhuǎn)換。
用戶沒(méi)有按照ON_MESSAGE宏的約定聲明來(lái)定義消息響應(yīng)函數(shù),就會(huì)造成錯(cuò)誤
舊版:
#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的嚴(yán)格檢查而出錯(cuò)
6.新的C++編譯器不再支持默認(rèn)類型的變量定義
7.for 語(yǔ)句的變量作用域問(wèn)題
8.strchr(_tcschr)、strpbrk(_tcspbrk ??)、strrchr(_tcsrchr)和strstr(_tcsstr)這四個(gè)函數(shù)在VC6的CRT庫(kù)中定義的返回值都是char *(TCHAR *),所以以前的代碼通常是這樣使用的:TCHAR *cp = _tcschr( pszPath, _T('//') ); //使用*cp,可以通過(guò)cp指針修改pszPath的內(nèi)容這其實(shí)是一個(gè)“漏洞”,因?yàn)槿绻鹥szPath是const char(TCHAR) *字符串,那么就表示它不希望修改字符串的內(nèi)容,但是調(diào)用strchr(_tcschr函數(shù)后就可以通過(guò)cp指針修改其內(nèi)容了,這豈不荒謬?所有在新版本的CRT庫(kù)中,這幾個(gè)函數(shù)的返回值都改成const
?char *。
9.wchar_t *類型與USHORT *的轉(zhuǎn)換錯(cuò)誤
?
總結(jié)
以上是生活随笔為你收集整理的Vs2010与VC的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VC++6.0和VC++2010的区别
- 下一篇: s3c2440移植MQTT