__declspec
Microsoft 特定的
用於指定儲存體類別資訊的擴充屬性語法是使用 __declspec
關鍵字,這會指定特定類型的執行個體要與以下所列的 Microsoft 特有儲存體類別屬性儲存在一起。 其他儲存體類別修飾詞的範例包括 static
和 extern
關鍵字。 不過,這些關鍵字是 C 和 C++ 語言的 ANSI 規格的一部分,因此擴充屬性語法未涵蓋它們。 擴充屬性語法可簡化並標準化 Microsoft 專有的 C 和 C++ 語言擴充功能。
文法
decl-specifier
:
__declspec (
extended-decl-modifier-seq
)
extended-decl-modifier-seq
:
extended-decl-modifier
opt
extended-decl-modifier
extended-decl-modifier-seq
extended-decl-modifier
:
align(
number )
allocate("
segname ")
allocator
appdomain
code_seg("
segname ")
deprecated
dllimport
dllexport
empty_bases
jitintrinsic
naked
noalias
noinline
noreturn
nothrow
novtable
no_sanitize_address
process
property(
{ get=
get-func-name | ,put=
put-func-name } )
restrict
safebuffers
selectany
spectre(nomitigation)
thread
uuid("
ComObjectGUID ")
空白字元會分隔宣告修飾詞序列。 範例會在後面的章節中顯示。
擴充屬性文法支援這些 Microsoft 特定的儲存體類別屬性:align
、allocate
、allocator
、appdomain
、code_seg
、deprecated
、dllexport
、dllimport
、empty_bases
、jitintrinsic
、naked
、noalias
、noinline
、noreturn
、nothrow
、novtable
、no_sanitize_address
、process
、restrict
、safebuffers
、selectany
、spectre
和 thread
。 它也支援這些 COM 物件屬性:property
和 uuid
。
code_seg
、dllexport
、dllimport
、empty_bases
、naked
、noalias
、nothrow
、no_sanitize_address
、property
、 restrict
、selectany
、thread
和 uuid
儲存體類別屬性只是物件宣告的屬性,或者是套用這些屬性的函式。 thread
屬性只會影響資料和物件。 naked
和 spectre
屬性只會影響函式。 dllimport
和 dllexport
屬性會影響函式、資料和物件。 property
、selectany
和 uuid
屬性會影響 COM 物件。
為了與舊版相容,除非指定了編譯器選項 /Za
(停用語言延伸模組),否則 _declspec
是 __declspec
的同義字。
__declspec
關鍵字應該放置在簡單宣告的開頭。 編譯器會忽略位在宣告中 * 或 & 後面的任何 __declspec
關鍵字,以及位在宣告中變數識別項前面的這類關鍵字,而不發出警告。
使用者定義類型宣告開頭所指定的 __declspec
屬性會套用至該類型的變數。 例如:
__declspec(dllimport) class X {} varX;
在本案例中,屬性會套用至 varX
。 __declspec
屬性會放在 class
或 struct
關鍵字後面,適用於使用者定義類型。 例如:
class __declspec(dllimport) X {};
在本案例中,屬性會套用至 X
。
簡單宣告之 __declspec
屬性的一般使用方針如下:
decl-specifier-seq
init-declarator-list
;
decl-specifier-seq
應該包含基底類型 (例如,int
、float
、typedef
或類別名稱)、記憶體類別 (例如,static
、extern
),或 __declspec
延伸模組。 此外,init-declarator-list
必須包含宣告的指標部分。 例如:
__declspec(selectany) int * pi1 = 0; //Recommended, 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;
END Microsoft 特定的