溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Visual Stuio 2005編譯器

發(fā)布時(shí)間:2021-12-04 14:18:11 來(lái)源:億速云 閱讀:169 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“如何使用Visual Stuio 2005編譯器”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用Visual Stuio 2005編譯器”這篇文章吧。

現(xiàn)在,Visual Stuio 2005編譯器可保證所有的本地全局變量及對(duì)象先初始化,然后才初始化托管全局變量及對(duì)象。這意味著,以前的代碼可能會(huì)在屬性方面碰到一個(gè)從未有過(guò)的編譯器錯(cuò)誤。

1、參數(shù)的有效性

在C運(yùn)行時(shí)庫(kù)中,加入了一些代碼,以檢查參數(shù)的有效性。例如:如果傳遞的目標(biāo)緩沖區(qū)大小不足以strcpy使用--通常這是在冒安全風(fēng)險(xiǎn),而新版本此時(shí)則會(huì)調(diào)用一個(gè)非法參數(shù)處理程序。在release版中,會(huì)調(diào)用Dr.Watson;而在debug版中,會(huì)產(chǎn)生斷言(assert),當(dāng)然,只要程序中傳遞的參數(shù)都是有效的,就不會(huì)有什么問(wèn)題了。

2、對(duì)非安全API的警告

在Visual C++ 2005中,CRT中的一組函數(shù)已不再建議使用,而應(yīng)使用新提供的安全版本。大多數(shù)這些不建議使用的函數(shù)如果使用不當(dāng),將會(huì)導(dǎo)致緩沖區(qū)溢出或其他安全問(wèn)題,這些函數(shù)如:strcpy、strcat等等。這些函數(shù)新的安全版本都在函數(shù)名后加了一個(gè)_s后綴,以方便識(shí)別,如strcpy_s、wcscpy_s、mbscpy_s、calloc_s和strcat_s這些函數(shù)。

如果想繼續(xù)使用老版本、非安全的函數(shù),可在源代碼開(kāi)始處加上#define value of _CRT_SECURE_NO_DEPRECATE(此處value代表某一數(shù)值);然而,還是建議大家升級(jí)代碼使用新的安全函數(shù)。

3、迭代器越界

受檢查的迭代器(checked iterators)和調(diào)試迭代器(debug iterators)也因?yàn)榘踩脑蜻M(jìn)行了相應(yīng)的更新,如果迭代器越界,則相應(yīng)會(huì)調(diào)用一個(gè)非法參數(shù)處理程序。

再次提醒,可以通過(guò)拋出一個(gè)越界異常來(lái)避免產(chǎn)生非法參數(shù)問(wèn)題。在代碼中加入#define value of _SECURE_SCL_THROWS,并把value值設(shè)為1,這樣就不會(huì)調(diào)用非法參數(shù)處理程序,而是產(chǎn)生一個(gè)異常了。

也可以通過(guò)設(shè)置#defined value of _SECURE_SCL值為零,關(guān)閉此迭代器檢查,通常默認(rèn)情況下,此選項(xiàng)是打開(kāi)的。

4、time_t類型

time_t類型通常用于顯示從1970年開(kāi)始以來(lái)的秒數(shù)。直到Visual C++ 7.1(即Visual C++ .net 2003),time_t類型都被定義為一個(gè)long,而到了Visual C++ 2005中,已被定義為一個(gè)64位類型,可用于顯示一直到3000年的時(shí)間了。

5、鏈接到CRT

托管應(yīng)用程序現(xiàn)在不能靜態(tài)鏈接到CRT。以往,在Visual C++ 7.0和7.1中(指Visual Studio .NET 2002與2003),可以生成靜態(tài)鏈接到CRT的CLR程序,而在Visual Studio 2005卻行不通。
6、單線程CRT支持

在Visual Studio 2005中,已經(jīng)取消了單線程CRT支持。而且用發(fā)展的眼光來(lái)看,未來(lái)大多數(shù)的人還是愿意使用線程安全的多線程代碼。
在線程中,可使用_nolock后綴來(lái)優(yōu)化代碼,但同時(shí),這些函數(shù)是非線程安全的。

7、異常處理

有兩種類型的異常處理可供選擇:/EHa(異步的)和/EHs(同步C++異常)。在以前,如果使用了/EHs,那么在一個(gè)catch(…)塊中,也許可能、也許不可能捕捉到結(jié)構(gòu)化異常,因?yàn)榇诵袨槭菦](méi)有定義且不可靠的;現(xiàn)在,再使用/EHs時(shí),就可保證不會(huì)捕捉到結(jié)構(gòu)化異常。如果想與以前版本的Visual C++保持一致,并且捕捉異步結(jié)構(gòu)化異常,還是應(yīng)該在編譯時(shí)使用/EHa。

8、初始化順序

以往,如果代碼中同時(shí)有托管與本地全局變量及對(duì)象,那么初始化順序是不確定的;如代碼中存在托管對(duì)象與本地對(duì)象互操作,就不能保證哪一個(gè)對(duì)象先初始化了?,F(xiàn)在,Visual Stuio 2005編譯器可保證所有的本地全局變量及對(duì)象先初始化,然后才初始化托管全局變量及對(duì)象。

9、printf

就目前來(lái)說(shuō),printf中的%n格式化指示符一般用于指定輸出的字符個(gè)數(shù)。這已經(jīng)確認(rèn)為一個(gè)安全隱患,并且已禁用,但可以使用set_printf_count_output來(lái)啟用它;通過(guò)傳遞給set_printf_count_output一個(gè)零值(0)可禁用它,而傳遞任意一個(gè)其他值可再次啟用。

10、swprintf函數(shù)

為與C++標(biāo)準(zhǔn)保持一致,對(duì)swprintf函數(shù)也作了修改,現(xiàn)在它已遵循C++標(biāo)準(zhǔn)了。在C++中,通過(guò)適當(dāng)?shù)膮?shù),可實(shí)現(xiàn)重載;這個(gè)函數(shù)的老版本已不再建議使用,因?yàn)樵贑中,是不允許重載的,因此如果使用老格式,將會(huì)返回一個(gè)錯(cuò)誤。
編譯器中的突破性變化

除了那些會(huì)影響到庫(kù)的變化之外,也有一些變化會(huì)影響到編譯器。以下是Visual C++ 2005中編譯器的主要變化,需再次提醒的是,此處并沒(méi)有列出所有的變化,但卻是微軟公司VC++使用者及內(nèi)部合作者所確認(rèn)的關(guān)鍵性變化。

指向成員的指針

在之前的Visual Stuio 2005編譯器版本中,一個(gè)指向成員的指針不需使用取址操作符(&)就能獲取,現(xiàn)在,Visual C++ 2005已經(jīng)嚴(yán)格按照標(biāo)準(zhǔn),必須要使用取址操作符,這也有助于消除潛在的運(yùn)行時(shí)錯(cuò)誤。但也導(dǎo)致了MFC庫(kù)的許多地方需要修改,同時(shí)意味著,可能會(huì)對(duì)現(xiàn)有的程序造成影響。

范圍限制規(guī)則

在for循環(huán)聲明中,默認(rèn)情況下不強(qiáng)制執(zhí)行范圍限制規(guī)則。在之前的版本中,for循環(huán)中變量的生命期將會(huì)延續(xù)到循環(huán)之外,為與標(biāo)準(zhǔn)兼容,for循環(huán)中定義的變量,現(xiàn)在只限定在for循環(huán)內(nèi)使用。

wchar_t類型

現(xiàn)在,wchar_t已為默認(rèn)內(nèi)置類型。這就是說(shuō),也許在以前,wchar_t可能會(huì)被當(dāng)作一個(gè)unsigned short,因?yàn)樗€不是內(nèi)置類型,所以,當(dāng)與那些有wchar_t類型變量的文件作符號(hào)比較時(shí),很可能會(huì)導(dǎo)致問(wèn)題。在Visual C++ 2005中,wchar_t已是一個(gè)內(nèi)置類型,也就是說(shuō),需要確定以前對(duì)wchar_t的用法不會(huì)導(dǎo)致轉(zhuǎn)譯為一個(gè)unsigned short。

異常處理

為了與庫(kù)的變化保持一致,編譯器已作了一些修改,以便不會(huì)捕捉到結(jié)構(gòu)化異常。所以,為與以前代碼保持兼容,還是應(yīng)該使用/EHa。

參數(shù)屬性

為了提供更健壯的屬性--也是為了代碼的健壯性,編譯器現(xiàn)在將會(huì)檢查類型、枚舉等等的屬性。這意味著,以前的代碼可能會(huì)在屬性方面碰到一個(gè)從未有過(guò)的編譯器錯(cuò)誤。

默認(rèn)為int

為遵循C++標(biāo)準(zhǔn),對(duì)沒(méi)有類型聲明的變量或函數(shù),已不再默認(rèn)為int類型。但在C語(yǔ)言中仍然可以,C++語(yǔ)言中已不行。這甚至也影響到了微軟公司自身的代碼,包括NT系統(tǒng)的代碼,所以***的方式,還是顯式聲明。

關(guān)于C的托管代碼

C語(yǔ)言編譯器一般不可能創(chuàng)建CLR的托管代碼,因?yàn)镃語(yǔ)言不是面向?qū)ο蟮?,它不符合CLR所使用的模型,因此,任何以C語(yǔ)言來(lái)編譯的代碼都會(huì)與CLR編譯器設(shè)置沖突。例如,如果在編譯時(shí)使用/TC設(shè)置,而且又設(shè)置了CLR,就會(huì)導(dǎo)致沖突。

面向CLR的新語(yǔ)法

通過(guò)設(shè)置/clr編譯選項(xiàng),C++編譯器只接受新語(yǔ)法。這將強(qiáng)制推廣加入到Visual C++ 2005中的新語(yǔ)法,同時(shí),也會(huì)廢棄掉老代碼。

安全檢查

在安全越來(lái)越得到重視的今天,安全檢查選項(xiàng)/GS,在默認(rèn)情況下就是打開(kāi)的,還是有一定道理的。在Visual C++ Visual Stuio 2005編譯器中,默認(rèn)情況下將會(huì)使用/GS選項(xiàng)。

以上是“如何使用Visual Stuio 2005編譯器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI