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
选择
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 对象。
为了与以前的版本兼容,除非指定编译器选项 _declspec,否则 __declspec 是 /Za 的同义词。
应将 __declspec 关键字放在简单声明的开头。 编译器忽略在 * 或 & 之后以及声明中变量标识符前面放置的任何 __declspec 关键字,而不发出警告。
用户定义的类型声明开头指定的 __declspec 属性适用于该类型的变量。 例如:
__declspec(dllimport) class X {} varX;
在这种情况下,该属性适用于 varX。
__declspec 或 class 关键字后放置的 struct 属性适用于用户定义的类型。 例如:
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 专用