VisualC++2005庫的十項突破性變化
Visual C++庫的十項突破性變化
Visual C++ 2005庫已經發生了一系列的變化,可能會對現有的程式有所影響,在升級到Visual C++ 2005之前,必須要確定程式中沒有這些問題。
1、引數的有效性
在C執行時庫中,加入了一些程式碼,以檢查引數的有效性。例如:如果傳遞的目標緩衝區大小不足以strcpy使用–通常這是在冒安全風險,而新版本此時則會呼叫一個非法引數處理程式。在release版中,會呼叫Dr.Watson;而在debug版中,會產生斷言(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)和除錯迭代器(debug 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的CLR程式,而在Visual Studio 2005卻行不通。
6、單執行緒CRT支援
在Visual Studio 2005中,已經取消了單執行緒CRT支援。而且用發展的眼光來看,未來大多數的人還是願意使用執行緒安全的多執行緒程式碼。
線上程中,可使用_nolock字尾來優化程式碼,但同時,這些函式是非執行緒安全的。
7、異常處理
有兩種型別的異常處理可供選擇:/EHa(非同步的)和/EHs(同步C++異常)。在以前,如果使用了/EHs,那麼在一個catch(…)塊中,也許可能、也許不可能捕捉到結構化異常,因為此行為是沒有定義且不可靠的;現在,再使用/EHs時,就可保證不會捕捉到結構化異常。如果想與以前版本的Visual C++保持一致,並且捕捉非同步結構化異常,還是應該在編譯時使用/EHa。
8、初始化順序
以往,如果程式碼中同時有託管與本地全域性變數及物件,那麼初始化順序是不確定的;如程式碼中存在託管物件與本地物件互操作,就不能保證哪一個物件先初始化了。現在,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的新語法
通過設定/clr編譯選項,C++編譯器只接受新語法。這將強制推廣加入到Visual C++ 2005中的新語法,同時,也會廢棄掉老程式碼。
安全檢查
在安全越來越得到重視的今天,安全檢查選項/GS,在預設情況下就是開啟的,還是有一定道理的。在Visual C++ 2005中,預設情況下將會使用/GS選項。
該文章轉載自網路大本營:http://www.xrss.cn/Dev/DotNet/200762214286.Html
相關文章
- 小量變引起大質變,多項式幾何助力旅行商問題研究取得突破性進展
- 十年來感受的前端技術變化前端
- HTML 5:足以改變我們未來生活的十項提示HTML
- java 例項變數初始化Java變數
- 我工作這十年-世界在變化
- LAPTOP:2013年科技行業十大突破性創新APT行業
- MIT Review:2014年十大突破性創新科技MITView
- 單例項資料庫工具轉化多例項資料庫單例資料庫
- 單例項資料庫手工轉化多例項資料庫單例資料庫
- ruby中的類例項變數和例項的例項變數變數
- 實時變化的時鐘效果程式碼例項
- Docker最全教程——資料庫容器化(十)Docker資料庫
- JavaScript 工作原理之十-使用 MutationObserver 監測 DOM 變化JavaScriptServer
- 類變數的初始化時機總是處於例項變數的初始化時機之前!變數
- Canal-監聽資料庫表的變化資料庫
- 資料庫正規化與例項資料庫
- Oracle 資料庫 PSU 的補丁號變化Oracle資料庫
- 阿里資料庫十年變遷,那些你不知道的二三事阿里資料庫
- Web開發者和設計師必須要知道的 iOS 8 十個變化WebiOS
- 給機器學習面試者的十項建議機器學習面試
- 麻省理工科技評:2018年“全球十大突破性技術”
- 這項突破性的新技術可以解決許多智慧手機常見的漏音問題
- 【變更】線上庫的變更操作
- 健壯的例項變數 (Non Fragile ivars)和脆弱的例項變數(Fragile ivars)變數
- 《麻省理工科技評論》:2020年全球“十大突破性技術”
- 最佳化資料庫前需考慮的十個問題(轉)資料庫
- 變態遊戲盒子排名前十 十大變態bt手遊遊戲盒子排名遊戲
- jquery監聽文字框內容變化程式碼例項jQuery
- js字型顏色隨機變化效果程式碼例項JS隨機
- 當一個常量被例項化,它就是變數了變數
- 《例項化需求》閱讀筆記(4)-開始改變筆記
- 十項最熱門的雲端計算技能
- DB2資料庫優化十大技巧AODB2資料庫優化
- 逐步分析MySQL從庫com_insert無變化的原因MySql
- 理解BERT:一個突破性NLP框架的綜合指南框架
- php例項化物件的例項方法PHP物件
- Android 支援庫 v26 有哪些變化?Android
- 最近十年,程式設計領域有什麼重大變化?程式設計