Visual C++為了讓程序員能夠自由的使用C++語言完成Windows應用程序的編寫,可謂“煞費苦心”,然而,同時因為一些原因Visual C++卻飽受爭議。這些爭議包括以下5點。
1.關於Visual C++對標准C++的支持
前面談到,Visual C++不是唯一的C++編譯器提供者,在linux環境下,GCC就很有知名度。而由於歷史原因,Visual C++ 6.0推出的時候,C++的標准還未形成,Visual C++ 6.0對標准C++的支持很差,據上面的數字來說,它只到70%左右。
但是細想,C++的標准化是什麼時候?C++自推出以來,其標准只有一個:即1998年由美國國家標准化協會ANSI和國際標准化組織ISO正式發布的C++語言的國際標准C++98ISO/IEC 14882:1998)。再來看看1998年的Visual C++ 6.0,那時的Visual C++ 6.0已經作為成熟的產品推出,其中包含了一些相對前衛的C++特性。就像要求山頂洞人圍獵時必須帶有狩獵證一樣,我們怎麼可以指望Visual C++ 6.0包含對標准C++的完整支持呢?當然,在前面的內容我們也講到了,Visual C++在後面的版本增強了對標准C++的支持,並使支持率達到98%以上!所以,對那些希望學習標准C++的讀者來說,千萬不要再抱著Visual C++ 6.0不放了。
提示
關於C++的標准化,2003年10月15日,ISO推出了C++標准的第2版C++2003ISO/IEC 14882:2003)。該版本在語法特征上沒有什麼變化,只是糾正了原版的各種錯誤,並進行了一些技術上的修訂。
2.關於Visual C++的體積
在以上幾個版本中,Visual C++ 6.0是最小的Visual C++,它的體積大概是一張CD,然而發展到Visual C++ 2008,其體積可以達到2GB!因此很多程序員對於Visual C++的第一印象是太過臃腫,實際上,Visual C++之所以能夠這麼肥胖,是因為它提供了更多、更強的功能。Visual C++的界面友好性及與其他系統如:Microsoft Office)的集成性,是誰也不可否認的。在存儲空間的成本日益變得廉價的今天,該特性不應成為程序員選擇Visual C++的否決因素。
3.關於Visual C++的MFC
MFC是Visual C++的靈魂,至少對其最初的版本來說是這樣。然而,MFC讓程序員產生了強烈的“MFC依賴症”,一旦離開了MFC,程序員就很難編寫出合適的程序,這讓Visual C++顯得與其他開放技術的不兼容。
MFC將常見的Windows對象和操作都封裝起來了,這讓程序員感覺到自己是一位面對黑色宇宙的宇航員,一旦離開了宇宙飛船,就會暈菜。至於宇宙飛船為什麼可以飛起來,如果一個程序員缺少足夠的時間和能力,就很難再去研究。如果一個Visual C++程序員不知道如何使用代碼手動的實現一個消息映射,那就很難掌握到真正的MFC。
一言以蔽之,MFC的不幸在於:其高超的封裝性反而讓程序員望而卻步,進而招來更多的負面評價:MFC不好用、MFC是封閉的、Visual C++是可怕的。
微軟應該也意識到了這個問題,將所有的程序基於MFC來開發是很可怕的。因此他們提出了ATL,將那些小型的、有用的類扔到ATL裡面去,而不必再依賴於MFC環境。比如:當讀者編寫一個使用CString的程序,就不再需要MFC。如果想將一堆CString扔進一個map當中去,也可以不使用MFC。
4.關於Visual C++的語言擴展
如果你參與過Java語言的開發,你會發現有些事情在Java語言中實現起來輕而易舉:
該段代碼演示了如何獲取一個對象的類信息,並從一個類創建一個實例對象。在C++語言中,要實現類似的功能簡直比登天還難!但是Visual C++覺得它應該幫助程序員來做這件事,遺憾的是它骨子裡還是C++,先天不足,所以最後它不得不依靠一些旁門左道如:宏)等非正當的手段來維護一個屬於自己的王國,而這個王國的基礎就是CObject及CRuntimeClass。在Visual C++項目中,很難找到與CObject、CRuntimeClass完全無關的代碼,程序員可以通過CObject、CRuntimeClass擁有超強的能力,但是也常常會因為這些黑幕技術感到困惑。
5.關於Visual C++的語法擴展
在Visual C++.NET中,你可以使用如下語句:
這段代碼被稱做托管代碼,它采用了C++/CLICLI:Common Language Infrastructure)語言在某段時間,這門語言被稱做“托管C++”語言)。“CLI”即公共語言基礎結構Common Language
Infrastructure),這是一個支持動態組件編程模型的多層架構。在許多方面,它所表示的對象模型和C++的完全相反。它是一個運行時軟件層 ,一個虛擬執行系統,運行在應用程序和底層操作系統之間。斜線“/”表示它是靜態C++對象模型到動態CLI組件對象模型的一種綁定。
C++/CLI語言在兼容原有的C++標准的同時,重新簡化了托管代碼擴展的語法,提供了更好的代碼可讀性。和微軟.NET的其他語言一樣,微軟向ECMA提交了C++/CLI的標准化請求,並且被ECMA通過成為正式的標准。C++/CLI現在可以被Visual C++ 2005和更高版本的編譯器支持。
大家知道,.NET框架封裝了大量的API,例如網絡訪問、字符串操作、數據訪問、XML服務、圖形界面控件庫、郵件服務、加密服務、文件輸入/輸出,甚至是WMI管理,也使得應用程序員可以編寫更加簡潔的代碼。通過采用C++/CLI,傳統的C++代碼可以較快地移植到新的平台上,而且即使不完全重寫代碼,也可以通過互操作在同一個模塊中無縫整合托管和非托管代碼,從新的.Net框架中獲益。一個比較顯著的特性是:使用C++/CLI編寫托管代碼,內存管理的工作可以讓CLR去自動處理,訪問時也增加了類型檢查,減少了緩沖區溢出和內存洩漏的危險,增加了程序的穩定性。
===========================================
以上摘自《把脈VC++》第2.1.4小節的內容
本文出自 “白喬博客” 博客,請務必保留此出處http://bluejoe.blog.51cto.com/807902/192763