__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
、 dllimport
safebuffers
code_seg
appdomain
deprecated
novtable
noalias
naked
nothrow
no_sanitize_address
noinline
process
jitintrinsic
noreturn
dllexport
selectany
restrict
empty_bases
spectre
和 。thread
它也支援這些 COM 物件屬性: property
和 uuid
。
code_seg
、dllexport
、、、nothrow
naked
no_sanitize_address
noalias
restrict
empty_bases
property
selectany
thread
和 uuid
storage-class 屬性只是套用物件或函式宣告的屬性。 dllimport
屬性 thread
只會影響數據和物件。 naked
和 spectre
屬性只會影響函式。 dllimport
和 dllexport
屬性會影響函式、資料和物件。 property
、 selectany
和 uuid
屬性會影響 COM 物件。
為了與舊版相容,_declspec
除非指定編譯程式選項/Za
(停用語言延伸模組),否則 是的__declspec
同義字。
__declspec
關鍵詞應該放在簡單宣告的開頭。 編譯程式會忽略在宣告中變數標識符前面加上 * 或 和 之後的任何 __declspec
關鍵詞,而不發出警告。
__declspec
用戶定義型別宣告開頭所指定的屬性會套用至該類型的變數。 例如:
__declspec(dllimport) class X {} varX;
在本案例中,屬性會套用至 varX
。 __declspec
置於 或 struct
關鍵詞之後class
的屬性會套用至使用者定義型別。 例如:
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 特定的
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應