_declspec用法_第1頁
_declspec用法_第2頁
_declspec用法_第3頁
_declspec用法_第4頁
_declspec用法_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、方式的修飾符如static與extern等是C和C+語言的ANSIDO,而_declspecOODD展屬性的定義。擴(kuò)展屬性語法簡化并標(biāo)準(zhǔn)化了COC+語言關(guān)于Microsoft的擴(kuò)展。用法:_declspec(extended-decl-modifier)extended-decl-modifier參數(shù)如下,可同時(shí)出現(xiàn),中間有空格隔開:align(C+)allocateappdomaindeprecated(C+)dllimportdllexportjitintrinsicnaked(C+)noaliasnoinlinenoreturnnothrow(C+)novtableprocessprop

2、erty(C+)restrictselectanythreaduuid(C+)l._declspec關(guān)鍵字應(yīng)該出現(xiàn)在簡單聲明的前面。對于出現(xiàn)在*或&后面或者變量聲明中標(biāo)識符的前面的_declspec,編譯器將忽略并且不給出警告。2.要注意區(qū)分_declspec是修飾類型還是修飾變量:declspec(align(8)structStrb;修飾的是變量b。其它地方定義的structStr類型的變量將不受_declspec(align(8)影響。_declspec(align(8)structStr;修飾的是structStr類型。所有該類型的變量都受_declspec(align(8)影響。al

3、ign:格式:_declspec(align(n)declarator其中,n是對齊參數(shù),其有效值是的整數(shù)次冪(從到字節(jié)),如,或。參數(shù)declarator是要設(shè)置對齊方式的數(shù)據(jù)。1.使用_declspec(align(n)來精確控制用戶自定義數(shù)據(jù)的對齊方式。你可以在定義struct,union,class或聲明變量時(shí)使用_declspec(align(n)。2.不能為函數(shù)參數(shù)使用_declspec(align(n)。3.如果未使用_declspec(align(#),編譯器將根據(jù)數(shù)據(jù)大小按自然邊界對齊。如字節(jié)整數(shù)按字節(jié)邊界對齊;字節(jié)double按字節(jié)邊界對齊。類或結(jié)構(gòu)體中的數(shù)據(jù),將取數(shù)據(jù)本身

4、的自然對齊方式和#pragmapack(n)設(shè)置的對齊系數(shù)中的最小值進(jìn)行對齊。4._declspec(align(n)和#pragmapack(n)是一對兄弟,前者規(guī)定了對齊系數(shù)的最小值,后者規(guī)定了對齊系數(shù)的最大值。5.當(dāng)兩者同時(shí)出現(xiàn)時(shí),前者擁有更高的優(yōu)先級。即,當(dāng)兩者同時(shí)出現(xiàn)且值矛盾時(shí),后者將不起作用。6.ODOsize大于等于#pragmapack(n)指定的n,而且_declspec(align(n)指定的數(shù)值比對應(yīng)類型長度小的時(shí)候,這個(gè)declspec(align(n)指定將不起作用。7.當(dāng)#pragmapack(n)指定的值n大于等于所有數(shù)據(jù)成員sizeODD,這個(gè)值n將不起作用。a

5、llocate:格式:_declspec(allocate(segname)declarator為數(shù)據(jù)指定存儲的數(shù)據(jù)段。數(shù)據(jù)段名必須為以下列舉中的一個(gè):code_segconst_segdata_seginit_segsectionappdomain:指定托管程序中的每個(gè)應(yīng)用程序域都要有一份指定全局變量或靜態(tài)成員變量的拷貝。deprecated:與#pragmadeprecated()O作用相同。用于指定函數(shù)的某個(gè)重載形式是不推薦的。當(dāng)在程序中調(diào)用了被deprecated修飾的函數(shù)時(shí),編譯器將給出C4996警告,并且可以指定具體的警告信息。該警告信息可以來源于定義的宏。例如:/compilew

6、ith:/W3#defineMY_TEXTfunctionisdeprecatedvoidfunc1(void)declspec(deprecated)voidfunc1(int)declspec(deprecated(*thisisadeprecatedfunction*)voidfunc2(int)declspec(deprecated(MY_TEXT)voidfunc3(int)intmain()func1();funcl(l);/C4996,警告信息:warningC4996:func1:wasdeclareddeprecatedfunc2(l);/C4996,警告信息:warning

7、C4996:func2:*thisisadeprecatedfunction*func3(l);/C4996,警告信息:warningC4996:func3:functionisdeprecateddllimport,dllexport:格式:_declspec(dllimport)declarator_declspec(dllexport)declarator分別用來從dll導(dǎo)入函數(shù),數(shù)據(jù),或?qū)ο笠约皬膁ll中導(dǎo)出函數(shù),數(shù)據(jù),或?qū)ο?。相?dāng)于定義了dll的接口,為它的客戶exe或dll定義可使用的函數(shù),數(shù)據(jù),或?qū)ο?。將函?shù)聲明成dllexport就可以免去定義模塊定義(.DEF)文件。dlle

8、xport代替了_export關(guān)鍵字。被聲明為dllexport的C+函數(shù)導(dǎo)出時(shí)的函數(shù)名將會按照C+規(guī)則經(jīng)過處理。如果要求不按照C+規(guī)則進(jìn)行名字處理,請使用.def00000externC。jitintrinsic:格式:_declspec(jitintrinsic)用于標(biāo)記一個(gè)函數(shù)或元素是位通用語言運(yùn)行時(shí)使用jitintrinsic會在函數(shù)簽名中加入naked:格式:_declspec(naked)declarator此關(guān)鍵字僅用于x86系統(tǒng),多用于虛擬設(shè)備驅(qū)動。含任何注釋或標(biāo)記。僅可以對函數(shù)的定義使用,(CLR)。主要用于Microsoft提供的某些庫中。MODOPT(IsJitIntri

9、nsic)。此關(guān)鍵字可以使編譯器在生成代碼時(shí)不包不能用于數(shù)據(jù)聲明、定義,或者函數(shù)的聲明。noalias:僅適用于函數(shù),它指出該函數(shù)是半純粹的函數(shù)。半純粹的函數(shù)是指僅引用或修改局部變量、參數(shù)和第一層間接參數(shù)。它是對編譯器的一個(gè)承諾,如果該函數(shù)引用全局變量或第二層間接指針參數(shù),則編譯器會生成中斷應(yīng)用程序的代碼。restrict:格式:_declspec(restrict)return_typef();僅適用于返回指針的函數(shù)聲明或定義,如,CRT的malloc函數(shù):_declspec(restrict)void*malloc(size_tsize);它告訴編譯器該函數(shù)返回的指針不會與任何其它的指針混

10、淆。它為編譯器提供執(zhí)行編譯器優(yōu)化的更多信息。對于編譯器來說,最大的困難之一是確定哪些指針有必要指出,這是對編譯器的一個(gè)_declspec(restrict),則會與其它指針混淆,而使用這些信息對編譯器很有幫助。承諾,編譯器并不對其進(jìn)行驗(yàn)證。如果您的程序不恰當(dāng)?shù)厥褂迷摮绦虻男袨闀徽_。noinline:格式:return-type_declspec(nothrow)call-conventionfunction-name因?yàn)樵陬惗x中定義的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式指定類中的某個(gè)函數(shù)不需要inline(內(nèi)聯(lián))。如果一個(gè)函數(shù)很小而且對系統(tǒng)性能影響不大

11、,有必要將其聲明為非內(nèi)斂的。例如,用于處理錯(cuò)誤情況的函數(shù)。noreturn:一個(gè)函數(shù)被_declspec(noreturn)所修飾,那么它的含義是告訴編譯器,這個(gè)函數(shù)不會返回,C2202其結(jié)果是讓編譯器知道被修飾為_declspec(noreturn)的函數(shù)之后的代碼不可到達(dá)。如果編譯器發(fā)現(xiàn)一個(gè)函數(shù)有無返回值的代碼分支,編譯器將會報(bào)C4715警告,或者錯(cuò)誤信息。如果這個(gè)代碼分支是因?yàn)楹瘮?shù)不會返回從而無法到達(dá)的話,可以使用約定_declspec(noreturn)來避免上述警告或者錯(cuò)誤。將一個(gè)期望返回的函數(shù)約定為_declspec(noreturn)將導(dǎo)致未定義的行為。在下面的這個(gè)例子中,mai

12、n00000else分支返回,所以約定函數(shù)fatal為_declspec(noreturn)來避免編譯或警告信息。_declspec(noreturn)externvoidfatal()intmain()if(1)return1;elseif(0)return0;elsefatal();nothrow:(argument-list)可用于函數(shù)聲明。告訴編譯器被聲明的函數(shù)以及函數(shù)內(nèi)部調(diào)用的其它函數(shù)都不會拋出異常。novtable:可用于任何類聲明中,但最好只用于純接口類,即類本身從不實(shí)例化。此關(guān)鍵字的聲明將阻止編譯器對構(gòu)造和析構(gòu)函數(shù)的vfptr的初始化??蓛?yōu)化編譯后代碼大小。如果試圖實(shí)例化一個(gè)用

13、_declspec(novtable)聲明的類然后訪問類中成員,則會在運(yùn)行時(shí)產(chǎn)生訪問錯(cuò)誤(accessviolation,即AV)。格式:return-type_declspec(nothrow)call-conventionfunction-name因?yàn)樵陬惗x中定義的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式指定類中格式:return-type_declspec(nothrow)call-conventionfunction-name因?yàn)樵陬惗x中定義的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式指定類中process:表示你的托管

14、應(yīng)用程序進(jìn)程應(yīng)該擁有一份指定全局變量,靜態(tài)成員變量,或所有應(yīng)用程序域共享的靜態(tài)本地變量的拷貝。在使用/clr:pure進(jìn)行編譯時(shí),應(yīng)該使用_declspec(process),因?yàn)槭褂?clr:pure進(jìn)行編譯時(shí),在默認(rèn)情況下,每個(gè)應(yīng)用程序域擁有一份全局和靜態(tài)變量的拷貝。在使用/clr進(jìn)行編譯時(shí),不必使用declspec(process),格式:return-type_declspec(nothrow)call-conventionfunction-name因?yàn)樵陬惗x中定義的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式指定類中格式:return-type_decl

15、spec(nothrow)call-conventionfunction-name因?yàn)樵陬惗x中定義的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式指定類中因?yàn)槭褂胈declspec(process)修/clr進(jìn)行編譯時(shí),在默認(rèn)情況下,每個(gè)進(jìn)程有一份全局和靜態(tài)變量的拷貝。只有全局變量,靜態(tài)成員變量,或本地類型的本地靜態(tài)變量可以用飾。在使用/clr:pure進(jìn)行編譯時(shí),被聲明為_declspec(process)的變量同時(shí)也應(yīng)該聲明為格式:return-type_declspec(nothrow)call-conventionfunction-name因?yàn)樵陬惗x中定義

16、的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式指定類中格式:return-type_declspec(nothrow)call-conventionfunction-name因?yàn)樵陬惗x中定義的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式指定類中appdomain。const類型。如果想每個(gè)應(yīng)用程序域擁有一份全局變量的拷貝時(shí),請使用property:格式:_declspec(property(get=get_func_name)declarator因?yàn)樵陬惗x中定義的成員函數(shù)默認(rèn)都是inline的,_declspec(naked)用于顯式

17、指定類中_declspec(property(put=put_func_name)declarator_declspec(property(get=get_func_name,put=put_func_name)declarator該屬性可用于類或結(jié)構(gòu)定義中的非靜態(tài)“虛數(shù)據(jù)成員”。實(shí)際上就是做了一個(gè)映射,把你的方法映射成屬性,以供訪問。get和put就是屬性訪問的權(quán)限,一個(gè)是讀的權(quán)限,一個(gè)是寫的權(quán)限。當(dāng)編譯器看到被property修飾的數(shù)據(jù)成員出現(xiàn)在成員選擇符(.或)的右邊的時(shí)候,它將把該操作轉(zhuǎn)換成get或put方法。該修飾符也可用于類或結(jié)構(gòu)定義中的空數(shù)組。用法如下:structSinti;v

18、oidputprop(intj)i=j;intgetprop()returni;_declspec(property(get=getprop,put=putprop)intthe_prop;intmain()Ss;s.the_prop=5;returns.the_prop;selectany:格式:_declspec(selectany)declarator在MFC,ATL的源代碼中充斥著_declspec(selectany)的聲明。selectany可以讓我們在.h文件中初始化一個(gè)全局變量而不是只能放在.cpp中。比如有一個(gè)類,其中有一個(gè)靜態(tài)變量,那么我們可以在.h中通過類似_declsp

19、ec(selectany)typeclass:variable=value;這樣的代碼來初始化這個(gè)全局變量。既是該.h被多次include,鏈接器也會為我們剔除多重定義的錯(cuò)誤。對于template的編程會有很多便利。用法如下:_declspec(selectany)intxl=l;/正確,xl被初始化,并且對外部可見const_declspec(selectany)intx2=2;/錯(cuò)誤,在C+中,默認(rèn)情況下const為static;但在C中是正確的,其默認(rèn)情況下const不為staticexternconst_declspec(selectany)intx3=3;/正確,x3是externc

20、onst,對外部可見externconstintx4;const_declspec(selectany)intx4=4;/正確,x4是externconst,對外部可見extern_declspec(selectany)intx5;/錯(cuò)誤,x5未初始化,不能用_declspec(selectany)修飾classXpublic:X(inti)i+;inti;_declspec(selectany)Xx(1);/正確,全局對象的動態(tài)初始化thread:格式:_declspec(thread)declarator聲明declarator為線程局部變量并具有線程存儲時(shí)限,以便鏈接器安排在創(chuàng)建線程時(shí)自動分配的存儲。線程局部存儲(TLS)是一種機(jī)制,在多線程運(yùn)行環(huán)境中,每個(gè)線程分配自己的局部數(shù)據(jù)。在標(biāo)準(zhǔn)多線程程序中,數(shù)據(jù)是在多個(gè)線程間共享的,而TLS是一種為每個(gè)線程分配

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論