__declspec
Microsoft 專有的
指定儲存類別資訊用途的延伸的屬性語法__declspec關鍵字,指定給定型別的執行個體時所儲存的下面列出的 Microsoft 特定的儲存類別屬性。 其他的儲存類別修飾詞的範例包括static和extern關鍵字。 不過,這些關鍵字是 c 和 C++ 語言中,ANSI 規格的一部分,因此未涵蓋的延伸的屬性語法。 延伸的屬性語法簡化了,而且標準化 Microsoft 專用 c 和 C++ 語言的運算式。
文法
decl 規範:
__declspec ( 擴充-decl-修飾詞為 seq)擴充-decl-修飾詞為 seq:
擴充 decl 修飾詞opt擴充 decl 修飾詞擴充-decl-修飾詞為 seq
擴充 decl 修飾詞:
align(#)allocate("segname")
appdomain
deprecated
dllimport
dllexport
jitintrinsic
naked
noalias
noinline
noreturn
nothrow
novtable
process
property({get=get_func_name|,put=put_func_name})
restrict
safebuffers
selectany
thread
uuid("ComObjectGUID")
泛空白字元分隔的宣告的修飾詞順序。 範例會顯示在較新的區段。
延伸的屬性文法支援這些特定 Microsoft 的儲存類別屬性: 對齊, 配置, appdomain, 已被取代的, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, 處理程序, 限制, safebuffers, >selectany,以及執行緒。 它也支援這些 COM 物件的屬性: 屬性 和 uuid。
dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread,以及uuid儲存類別屬性會以屬性之物件或它們所套用的函式的宣告。 thread屬性會影響資料,而且只有物件。 naked屬性會影響的函式只。 dllimport和dllexport屬性會影響函式、 資料和物件。 property, selectany,以及uuid屬性會影響 COM 物件。
__declspec關鍵字必須放在簡單的宣告的開頭。 編譯器會略過,如果沒有任何警告__declspec關鍵字後面 * 或 & 並在宣告變數的識別項的前面。
A __declspec中的使用者定義的型別宣告開頭所指定的屬性會套用到該型別的變數。 例如:
__declspec(dllimport) class X {} varX;
在此情況下,屬性會套用到varX。 A __declspec屬性放在後面class或struct關鍵字會套用到使用者定義型別。 例如:
class __declspec(dllimport) X {};
在此情況下,屬性會套用到X。
一般的指導方針,使用__declspec屬性為簡單的宣告如下:
decl-specifier-seq declarator-list;
Decl 規範 seq 功能應該包含,而在其他方面,基底型別 (例如: intfloat、 typedef,或類別名稱),儲存體的類別 (例如: static, extern), or the __declspec extension. 初始化宣告子清單應該包含,而在其他方面,宣告的指標部份。 例如:
__declspec(selectany) int * pi1 = 0; //OK, selectany & int both part of decl-specifier
int __declspec(selectany) * pi2 = 0; //OK, selectany & int both part of decl-specifier
int * __declspec(selectany) pi3 = 0; //ERROR, selectany is not part of a declarator
下列程式碼宣告整數執行緒區域變數,並且將它初始化的值:
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;