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 *的轉換錯誤
?
總結
以上是生活随笔為你收集整理的Vs2010与VC的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC++6.0和VC++2010的区别
- 下一篇: 为什么我的vc6.0建立工程时显示不能访