__declspec

Microsoft 专用

用于指定存储类信息的扩展特性语法使用 __declspec 关键字,该关键字指定给定类型的实例将与下面所列的 Microsoft 专用存储类特性一起存储。 其他存储类修饰符的示例包括 staticextern 关键字。 但是,这些关键字是 C 和 C++ 语言的 ANSI 规范的一部分,并且本身不包含在扩展特性语法中。 扩展特性语法简化并标准化了 Microsoft 专用的 C 和 C ++ 语言扩展。

语法

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

extended-decl-modifier-seq
extended-decl-modifieropt
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 专用存储类特性: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;

在本例中,此特性应用于 varX。 位于 classstruct 关键字后的 __declspec 特性适用于用户定义类型。 例如:

class __declspec(dllimport) X {};

在本例中,此特性应用于 X

关于将 __declspec 特性用于简单声明的一般准则如下所示:

decl-specifier-seq init-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 扩展的存储类特性