__declspec
Microsoft 专用
指定的存储类的信息扩展属性语法使用 __declspec 关键字,指定特定类型的实例将存储在下面列出的某个 Microsoft 存储特定类的属性。 其他存储类修饰符的示例包括 static 和 extern 关键字。 但是,这些关键字是 C 和 C++ 语言的 ANSI 规范的一部分,并且,,因为这样不受扩展特性语法中。 扩展属性语法简化和标准化特定于 Microsoft 的扩展到 C 和 C++ 语言。
语法
非阶级化说明符:
__declspec (扩展非阶级化修饰符顺序 )扩展非阶级化修饰符顺序:
扩展非阶级化修饰符opt扩展非阶级化修饰符序列的扩展非阶级化修饰符
扩展非阶级化修饰符:
align(#)allocate("segname")
appdomain
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 的存储类的属性: 对齐、 分配、 appdomain、 已弃用、 dllexport、 dllimport、 jitintrinsic、 裸、 noalias、 noinline、 noreturn、 nothrow、 novtable、 处理、 限制、 safebuffers、 selectany和 线程。 它还支持这些 COM 对象属性: 属性 和 uuid。
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;
非阶级化说明符顺序 应包含,此外,基础类型 (即。 int、 float、 typedef或类名),存储类 (即。 static、 extern),或者 __declspec 扩展。 init 公告列表 应包含,此外,声明的指针部件。 例如:
__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;