Visual C++ 2005中的突破性變化
Microsoft Visual C++ 2005是微軟公司Visual Studio 2005 開發 套件中的一出重頭戲,與前一個版本相比,其革新性的集成開發環境與C++編譯器,帶來了有許多改變。在本文中,主要講解 程序員 在升級程序時,可能會遇到的一些不同之處及變化,而這些變化很可能
Microsoft Visual
C++ 2005是微軟公司Visual Studio 2005
開發套件中的一出重頭戲,與前一個版本相比,其革新性的集成
開發環境與C++編譯器,帶來了有許多改變。在本文中,主要講解
程序員在升級程序時,可能會遇到的一些不同之處及變化,而這些變化很可能會使老一點的程序不能通過編譯??傊?,這些變化絕不是偶然發生的,其背后都有強大的理論依據在支撐,所以,使用Visual C++的程序員,在升級之前,一定要弄清楚這些變化。
Visual C++中已經發生的變化
微軟Visual C++工作小組在對其產品作出修改之前,已經過充分的考慮,同時也顧及到了這些改變會對以前的代碼造成的影響,雖然如此,但有以下理由支持在新版本中作出的這些改變:
Visual C++ 2005其中一個最重要之處,就是更加遵循ISO C++標準,可更好地跨平臺移植代碼,或集成進其他工具中,如聲明在for循環中的變量生命期及變量類型現在也遵循C++標準了;而且,在默認設置中,就是遵循ISO C++標準的。正是因為此,在一些老代碼中,過去可行的一些方法,現在可能要作出必要的修改,才能通過編譯了。
在這幾年中,
安全性是一個熱門的話題,而且在將來也會得來越來越多的重視。C++語言賦于了程序員無所不能的能力,但凡事總有兩面性;為減少代碼中的
安全問題,也為減少代碼中錯誤產生的可能性,Visual C++ 2005作出了一系列的改變,首先,引入了
安全CRT及不推薦使用的非安全API等概念,而且在默認狀態下,Visual C++ 2005也會進行代碼安全檢查。
Visual C++ 2005增強了適用性,這也使得可更方便地升級本身的二進制代碼成為可能,而且,也更加容易進行產品的漏洞修補。
可維護性也是一個促進Visual C++變化的原因之一,例如,低價值的功能已經從產品中消失,以減少在將來維護它們的可能性。一個例子就是,Visual Studio 2005中已經移除了單線程CRT,因為已經不再需要它了,以前為維護單線程CRT所花費的時間,現在可以用在更重要的事情上了。
最后,其中的某些變化,是為了增強Visual C++編譯器的
可靠性,為達此目的,微軟公司此次保證了Visual C++中有明確定義并一致的行為。
當然,也要避免某些變化,此次Visual C++的大多數變化都是在代碼安全層面上,如果這些變化向后影響到二進制代碼的
兼容性,那么就會盡量避免,因為源代碼
兼容性總是在二進制代碼
兼容性之前被發現的。另外,如果某些變化致使人們不想采用或升級到2005版,那么這種變化也要避免,因為這會導致軟件項目的總成本增加。最后,編寫代碼方式的改變也要在成本上證明是值得的,否則,就沒有必要去實現它了。
Visual C++庫的十項突破性變化
Visual C++ 2005庫已經發生了一系列的變化,可能會對現有的程序有所影響,在升級到Visual C++ 2005之前,必須要確定程序中沒有這些問題。
1、參數的有效性
在C運行時庫中,加入了一些代碼,以檢查參數的有效性。例如:如果傳遞的目標緩沖區大小不足以strcpy使用--通常這是在冒安全風險,而新版本此時則會調用一個非法參數處理程序。在release版中,會調用Dr.Watson;而在de
bug版中,會產生斷言(assert),當然,只要程序中傳遞的參數都是有效的,就不會有什么問題了。
2、對非安全API的警告
在Visual C++ 2005中,CRT中的一組函數已不再建議使用,而應使用新提供的安全版本。大多數這些不建議使用的函數如果使用不當,將會導致緩沖區溢出或其他安全問題,這些函數如:strcpy、strcat等等。這些函數新的安全版本都在函數名后加了一個_s后綴,以方便識別,如strcpy_s、wcscpy_s、mbscpy_s、calloc_s和strcat_s這些函數。
如果想繼續使用老版本、非安全的函數,可在源代碼開始處加上#define value of _CRT_SECURE_NO_DEPRECATE(此處value代表某一數值);然而,還是建議大家升級代碼使用新的安全函數。
3、迭代器越界
受檢查的迭代器(checked iterators)和調試迭代器(de
bug iterators)也因為安全的原因進行了相應的更新,如果迭代器越界,則相應會調用一個非法參數處理程序。
再次提醒,可以通過拋出一個越界異常來避免產生非法參數問題。在代碼中加入#define value of _SECURE_SCL_THROWS,并把value值設為1,這樣就不會調用非法參數處理程序,而是產生一個異常了。
也可以通過設置#defined value of _SECURE_SCL值為零,關閉此迭代器檢查,通常默認情況下,此選項是打開的。
4、time_t類型
time_t類型通常用于顯示從1970年開始以來的秒數。直到Visual C++ 7.1(即Visual C++
.NET 2003),time_t類型都被定義為一個long,而到了Visual C++ 2005中,已被定義為一個64位類型,可用于顯示一直到3000年的時間了。
5、鏈接到CRT
托管應用程序現在不能靜態鏈接到CRT。以往,在Visual C++ 7.0和7.1中(指Visual Studio .NET 2002與2003),可以生成靜態鏈接到CRT的C
LR程序,而在Visual Studio 2005卻行不通。
6、單線程CRT支持
在Visual Studio 2005中,已經取消了單線程CRT支持。而且用發展的眼光來看,未來大多數的人還是愿意使用線程安全的多線程代碼。
在線程中,可使用_nolock后綴來優化代碼,但同時,這些函數是非線程安全的。
7、異常處理
有兩種類型的異常處理可供選擇:/EHa(異步的)和/EHs(同步C++異常)。在以前,如果使用了/EHs,那么在一個catch(…)塊中,也許可能、也許不可能捕捉到結構化異常,因為此行為是沒有定義且不可靠的;現在,再使用/EHs時,就可保證不會捕捉到結構化異常。如果想與以前版本的Visual C++保持一致,并且捕捉異步結構化異常,還是應該在編譯時使用/EHa。
8、初始化順序
以往,如果代碼中同時有托管與本地全局變量及對象,那么初始化順序是不確定的;如代碼中存在托管對象與本地對象互操作,就不能保證哪一個對象先初始化了?,F在,Visual Stuio 2005可保證所有的本地全局變量及對象先初始化,然后才初始化托管全局變量及對象。
9、printf
就目前來說,printf中的%n格式化指示符一般用于指定輸出的字符個數。這已經確認為一個安全隱患,并且已禁用,但可以使用set_printf_count_output來啟用它;通過傳遞給set_printf_count_output一個零值(0)可禁用它,而傳遞任意一個其他值可再次啟用。
10、swprintf函數
為與C++標準保持一致,對swprintf函數也作了修改,現在它已遵循C++標準了。在C++中,通過適當的參數,可實現重載;這個函數的老版本已不再建議使用,因為在C中,是不允許重載的,因此如果使用老格式,將會返回一個錯誤。
編譯器中的突破性變化
除了那些會影響到庫的變化之外,也有一些變化會影響到編譯器。以下是Visual C++ 2005中編譯器的主要變化,需再次提醒的是,此處并沒有列出所有的變化,但卻是微軟公司VC++使用者及內部合作者所確認的關鍵性變化。
指向成員的指針
在之前的版本中,一個指向成員的指針不需使用取址操作符(&)就能獲取,現在,Visual C++ 2005已經嚴格按照標準,必須要使用取址操作符,這也有助于消除潛在的運行時錯誤。但也導致了MFC庫的許多地方需要修改,同時意味著,可能會對現有的程序造成影響。
范圍限制規則
在for循環聲明中,默認情況下不強制執行范圍限制規則。在之前的版本中,for循環中變量的生命期將會延續到循環之外,為與標準兼容,for循環中定義的變量,現在只限定在for循環內使用。
wchar_t類型
現在,wchar_t已為默認內置類型。這就是說,也許在以前,wchar_t可能會被當作一個unsigned short,因為它還不是內置類型,所以,當與那些有wchar_t類型變量的文件作符號比較時,很可能會導致問題。在Visual C++ 2005中,wchar_t已是一個內置類型,也就是說,需要確定以前對wchar_t的用法不會導致轉譯為一個unsigned short。
異常處理
為了與庫的變化保持一致,編譯器已作了一些修改,以便不會捕捉到結構化異常。所以,為與以前代碼保持兼容,還是應該使用/EHa。
參數屬性
為了提供更健壯的屬性--也是為了代碼的健壯性,編譯器現在將會檢查類型、枚舉等等的屬性。這意味著,以前的代碼可能會在屬性方面碰到一個從未有過的編譯器錯誤。
默認為int
為遵循C++標準,對沒有類型聲明的變量或函數,已不再默認為int類型。但在C語言中仍然可以,C++語言中已不行。這甚至也影響到了微軟公司自身的代碼,包括NT系統的代碼,所以最好的方式,還是顯式聲明。
關于C的托管代碼
C語言編譯器一般不可能創建CLR的托管代碼,因為C語言不是
面向對象的,它不符合CLR所使用的模型,因此,任何以C語言來編譯的代碼都會與CLR編譯器設置沖突。例如,如果在編譯時使用/TC設置,而且又設置了CLR,就會導致沖突。
面向CLR的新語法
通過設置/c
lr編譯選項,C++編譯器只接受新語法。這將強制推廣加入到Visual C++ 2005中的新語法,同時,也會廢棄掉老代碼。
安全檢查
在安全越來越得到重視的今天,安全檢查選項/GS,在默認情況下就是打開的,還是有一定道理的。在Visual C++ 2005中,默認情況下將會使用/GS選項。
結論
本文列出了微軟公司已確認的Visual C++ 2005中的一些關鍵性變化,雖然不是所有的變化,也不是最有可能沖擊到代碼的變化,但此處所列出的項目,將最有可能導致問題的產生。
歸根結底,在升級或用新版編譯器對程序作修改之前,必須先試著編譯現有程序,以確認代碼能通過編譯,否則,就不可避免要動手修正源代碼中存在的問題。
原文轉自:http://www.kjueaiud.com
- 評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
-
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|