__declspec

Microsoft 专用

用于指定存储类信息的扩展属性语法采用__declspec关键字,该关键字指定将以Microsoft特定存储类属性存储给定类型的实例,具体属性如下所列。 其他存储类修饰符的示例包括 staticextern 关键字。 但是,这些关键字是 C 和 C++ 语言的 ANSI 规范的一部分,因此,扩展属性语法并未涵盖这些关键字。 扩展属性语法简化并标准化了 Microsoft 特定的 C 和 C++ 语言扩展。

语法

decl-specifier
__declspec (extended-decl-modifier-seq)

extended-decl-modifier-seq
extended-decl-modifier opt
extended-decl-modifierextended-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存储类属性:alignallocateallocatorappdomaincode_segdeprecateddllexportdllimportempty_basesjitintrinsicnakednoaliasnoinlinenoreturnnothrownovtableno_sanitize_addressprocessrestrictsafebuffersselectanyspectrethread。 它还支持以下 COM 对象属性:propertyuuid

code_segdllexportdllimportempty_basesnakednoaliasnothrowno_sanitize_addresspropertyrestrictselectanythreaduuid 存储类属性仅是应用它们的对象的声明或函数的属性。 thread 属性仅影响数据和对象。 nakedspectre 属性仅影响函数。 dllimportdllexport 属性会影响函数、数据和对象。 propertyselectanyuuid 属性会影响 COM 对象。

为了与以前的版本兼容,除非指定编译器选项 /Za(禁用语言扩展),否则 _declspec__declspec 的同义词。

应将 __declspec 关键字放在简单声明的开头。 编译器忽略在 * 或 & 之后以及声明中变量标识符前面放置的任何 __declspec 关键字,而不发出警告。

用户定义的类型声明开头指定的 __declspec 属性适用于该类型的变量。 例如:

__declspec(dllimport) class X {} varX;

在这种情况下,该属性适用于 varXclassstruct 关键字后放置的 __declspec 属性适用于用户定义的类型。 例如:

class __declspec(dllimport) X {};

在这种情况下,该属性适用于 X

对简单声明使用 __declspec 属性的一般准则如下:

decl-specifier-seqinit-declarator-list;

此外,decl-specifier-seq 应包含基类型(例如 intfloattypedef 或类名)、存储类(例如 staticextern)或 __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 专用

另请参阅

关键字
C 扩展的存储类属性