__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
hybrid_patchable
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 专用