詳解Visual C 2005中的突破性變化

2021-04-16 20:03:54 字數 3579 閱讀 2961

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;而在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,這樣就不會呼叫非法引數處理程式,而是產生乙個異常了。 

編譯器中的突破性變化

除了那些會影響到庫的變化之外,也有一些變化會影響到編譯器。以下是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選項。

結論

本文列出了微軟公司已確認的visual c++ 2005中的一些關鍵性變化,雖然不是所有的變化,也不是最有可能衝擊到**的變化,但此處所列出的專案,將最有可能導致問題的產生。

歸根結底,在公升級或用新版編譯器對程式作修改之前,必須先試著編譯現有程式,以確認**能通過編譯,否則,就不可避免要動手修正源**中存在的問題。

Visual C 2005使用入門

功能強大的visual studio 2005 ide龐大的開發環境和n多的配置設定,學習起來還不是很簡單。c cli通過對iso c 標準的純粹擴充套件和新語法,不像傳統的ms dos 控制台程式,所以對於新手,首先應弄明白怎樣在visual studio 2005開發環境下編譯常規控制台應用程式...

Visual C 2005搶先預覽

microsoft visual studio 的下一版 代號為 whidbey 明顯增強了 c 的功能,包括創新的語言結構 新編譯器功能 大幅提公升了開發人員的生產力 加強除錯功能等等。在程式語言創新功能方面,c whidbey 發行版本支援泛型 generics iterator 迭代器 部份型...

Visual C 2005使用入門

功能強大的visual studio 2005 ide龐大的開發環境和n多的配置設定,學習起來還不是很簡單。c cli通過對iso c 標準的純粹擴充套件和新語法,不像傳統的ms dos 控制台程式,所以對於新手,首先應弄明白怎樣在visual studio 2005開發環境下編譯常規控制台應用程式...