__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-modifieropt

    extended-decl-modifier extended-decl-modifier-seq

  • extended-decl-modifier:
    align(#)

    allocate("segname")

    appdomain

    code_seg("segname")

    deprecated

    dllimport

    dllexport

    jitintrinsic

    naked

    noalias

    noinline

    noreturn

    nothrow

    novtable

    process

    property({get=get_func_name|,put=put_func_name})

    restrict

    safebuffers

    selectany

    thread

    uuid("ComObjectGUID")

空格用于分隔声明修饰符序列。 示例显示在后面的部分。

扩展的特性语法支持以下 Microsoft 专用存储类特性:alignallocateappdomaincode_segdeprecateddllexportdllimportjitintrinsicnakednoaliasnoinlinenoreturnnothrownovtableprocessrestrictsafebuffersselectanythread。 它还支持以下 COM 对象特性:propertyuuid

code_seg、dllexport、dllimport、naked、noalias、nothrow、property、restrict、selectany、thread 和 uuid 存储类特性只是要应用它们的对象或函数的声明的属性。 thread 特性仅影响数据和对象。 naked 特性仅影响函数。 dllimport 和 dllexport 特性影响函数、数据和对象。 property、selectany 和 uuid 特性影响 COM 对象。

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

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

__declspec(dllimport) class X {} varX;

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

class __declspec(dllimport) X {};

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

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

decl-specifier-seq declarator-list;

此外,decl-specifier-seq 还应包含一个基类型(如 int、float、typedef 或类名)、存储类(如 static 和 extern)或 __declspec 扩展。 此外,init-declarator-list 还应包含声明的指针部分。 例如:

__declspec(selectany) int * pi1 = 0;   //OK, 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;

请参见

参考

C++ 关键字

C 扩展的存储类特性