unique 特性
[unique] 属性指定唯一指针。
pointer_default(unique)
typedef [ unique [[ , type-attribute-list ]] ] type-specifier declarator-list;
typedef struct-or-union-declarator
{
[ unique [[ , field-attribute-list ]] ] type-specifier declarator-list;
...}
[ unique [[ , function-attribute-list ]] ] type-specifier ptr-decl function-name(
[[ [ parameter-attribute-list ] ]] type-specifier [[declarator]]
, ...);
[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
[ unique [[ , parameter-attribute-list ]] ] type-specifier [[declarator]]
, ...);
-
type-attribute-list
-
指定应用于类型的一个或多个属性。 有效的类型属性包括 [handle]、 [switch_type]、 [transmit_as];指针属性 [ref]、 [unique]或 [ptr];和用法属性 [context_handle]、 [string]和 [ignore]。 用逗号分隔多个属性。
-
type-specifier
-
declarator 和 declarator-list
-
指定标准 C 声明符,例如标识符、指针声明符和数组声明符。 有关详细信息,请参阅 数组和Sized-Pointer属性、 arrays.和 数组和指针。 declarator-list 由一个或多个用逗号分隔的声明符组成。 函数声明符中的参数名称标识符是可选的。
-
struct-or-union-declarator
-
field-attribute-list
-
指定应用于结构成员、联合成员或函数参数的零个或多个字段属性。 有效的字段属性包括 [first_is]、 [last_is]、 [length_is]、 [max_is]、 [size_is];用法属性 [string]、 [ignore]和 [context_handle];指针属性 [ref]、 [unique]或 [ptr];和联合属性 [switch_type]。 用逗号分隔多个字段属性。
-
function-attribute-list
-
指定应用于函数的零个或多个属性。 有效的函数属性为 [callback]、 [local];指针属性 [ref]、 [unique]或 [ptr];和用法属性 [string]、 [ignore] 和 [context_handle]。
-
ptr-decl
-
指定应用 [unique] 属性的至少一个指针声明符。 指针声明符与 C 中使用的指针声明符相同;它由 * 指示符、修饰符(如 far)和限定符 const 构造。
-
function-name
-
指定远程过程的名称。
-
parameter-attribute-list
-
包含适用于指定参数类型的零个或多个属性。 参数属性可以采用方向属性 [in] 和 [out];字段属性 [first_is]、 [last_is]、 [length_is]、 [max_is]、 [size_is]和 [switch_type];指针属性 [ref]、 unique 或 ptr;和用法属性 [context_handle] 和 [string]。 usage 属性 [ignore] 不能用作参数属性。 用逗号分隔多个属性。
指针特性可以作为类型属性应用;作为应用于结构成员、联合成员或参数的字段属性;或 作为应用于函数返回类型的函数属性。 指针属性也可以与 [pointer_default] 关键字 (keyword) 一起显示。
唯一指针具有以下特征:
- 可以将 值设置为 NULL。
- 可以在调用期间从 NULL 更改为非 NULL、从非 NULL 更改为 NULL,或从一个非 NULL 值更改为另一个非 NULL 值。
- 可以在客户端上分配新内存。 当唯一指针从 NULL 更改为非 NULL 时,从服务器返回的数据将写入新存储。
- 可以在客户端上使用现有内存,而无需分配新内存。 当唯一指针在调用期间从一个非 NULL 值更改为另一个非 NULL 值时,假定该指针指向同一类型的数据对象。 从服务器返回的数据将写入调用前由唯一指针的值指定的现有存储中。
- 可以在客户端上孤立内存。 如果唯一指针在调用期间更改为 NULL,并且客户端没有取消引用存储的其他方法,则由非 NULL 唯一指针引用的内存可能永远不会释放。
- 不会导致别名。 与引用指针指向的存储一样,唯一指针指向的存储无法从函数中的其他任何名称访问。
存根midl_user_allocate调用用户提供的内存管理功能,midl_user_free分配和解除分配唯一指针及其引用所需的内存。
以下限制适用于唯一指针:
- [unique] 属性不能应用于绑定句柄参数 ( handle_t) 和上下文句柄参数。
- [unique] 属性不能应用于 [out]-only 顶级指针参数 (仅具有 [out] 方向属性) 的参数。
- 默认情况下,参数列表中的顶级指针是 [ref] 指针。 即使接口指定 pointer_default (唯一) 也是如此。 参数列表中的顶级参数必须使用 [unique] 属性指定为唯一指针。
- 唯一指针不能用于描述数组或联合臂的大小,因为唯一指针的值可以为 NULL。 此限制可防止将 NULL 值用作数组大小或联合臂大小时产生的错误。
pointer_default(unique)
typedef [unique, string] unsigned char * MY_STRING_TYPE;
[unique] char * MyFunction([in, out, unique] long * plNumber);