__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
。 位于 class
或 struct
关键字后的 __declspec
特性适用于用户定义类型。 例如:
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;
结束 Microsoft 专用