ptr 特性
[ptr] 属性将指针指定为完整指针。
pointer_default(ptr)
typedef [ ptr [ , type-attribute-list ] ] type-specifier declarator-list;
typedef [ struct | union ]
{
[ ptr [ , field-attribute-list ] ] type-specifier declarator-list;
...
}
[ ptr [ , function-attribute-list ] ] type-specifier ptr-decl function-name(
[ [ parameter-attribute-list ] ] type-specifier [standard-declarator]
, ...);
[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
[ ptr [[ , parameter-attribute-list ]] ] type-specifier [[standard-declarator]]
, ...);
parameters
-
type-attribute-list
-
指定应用于类型的一个或多个属性。 有效的类型属性包括 [handle]、 [switch_type]、 [transmit_as];指针属性 [ref]、 [unique 或 [ptr];以及用法属性 [context_handle]、 [string] 和 [ignore]。 用逗号分隔多个属性。
-
type-specifier
-
standard-declarator
-
指定标准 C 声明符,例如标识符、指针声明符或数组声明符。 有关详细信息,请参阅 数组和Sized-Pointer属性、 数组和 数组和指针。
-
declarator-list
-
指定标准 C 声明符,例如标识符、指针声明符和数组声明符。 有关详细信息,请参阅 数组和Sized-Pointer属性、 数组和 数组和指针。 declarator-list 由一个或多个用逗号分隔的声明符组成。 函数声明符中的参数名称标识符是可选的。
-
field-attribute-list
-
指定应用于结构或联合成员或函数参数的零个或多个字段属性。 有效的字段属性包括 [first_is]、 [last_is]、 [length_is]、 [max_is]、 [size_is];用法属性 [string]、 [ignore] 和 [context_handle];指针属性 [ref]、 [unique]或 [ptr];和 union 属性 [switch_type]。 用逗号分隔多个字段属性。
-
function-attribute-list
-
指定应用于函数的零个或多个属性。 有效的函数属性为 [callback]、 [local];指针属性 [ref]、 [unique]或 [ptr];和用法属性 [string]、 [ignore] 和 [context_handle] 。
-
ptr-decl
-
指定 [ptr] 属性应用到的至少一个指针声明符。 指针声明符与 C 中使用的指针声明符相同;它由 * 指示符、修饰符(如 far)和限定符 const 构造。
-
function-name
-
指定远程过程的名称。
-
parameter-attribute-list
-
包含适用于指定参数类型的零个或多个属性。 参数属性可以引入和退出方向属性;字段属性first_is、last_is、length_is、max_is、size_is和switch_type;指针属性 ref、unique 或 [ptr];和用法属性context_handle和字符串。 usage 属性 ignore 不能用作参数属性。 用逗号分隔多个属性。
备注
[ptr] 属性指定的完整指针接近 C 语言指针的完整功能。 完整指针的值可以为 NULL ,并且可以在调用期间从 NULL 更改为非 NULL。 支持别名和周期的应用程序中的其他名称可以访问由完整指针指向的存储。 在远程过程调用期间,此功能需要更多的开销来标识指针引用的数据、确定值是否为 NULL 以及发现两个指针是否指向同一数据。
将完整指针用于:
- 远程返回值。
- 双指针,当输出参数的大小未知时。
- NULL 指针。
完整 (和唯一) 指针不能用于描述数组或联合的大小,因为这些指针可以具有 NULL 值。 MIDL 的此限制可防止将 NULL 值用作大小时可能导致的错误。
假定引用和唯一指针不会导致数据别名化。 通过从唯一或引用指针开始且仅遵循唯一或引用指针获取的有向图既不包含重新生成,也不包含周期。
为了避免别名,应从同一类指针的输入指针获取所有指针值。 如果多个指针指向同一内存位置,则所有此类指针必须是完整指针。
在某些情况下,完整指针和唯一指针可以混合使用。 可以向完整指针分配唯一指针的值,只要赋值不违反更改唯一指针值的限制。 但是,为唯一指针分配完整指针的值时,可能会导致别名。
混合使用完整指针和唯一指针可能会导致别名,如以下示例所示:
typedef struct
{
[ptr] short * pdata; // full pointer
} GRAPH_NODE_TYPE;
typedef struct
{
[unique] graph_node * left; // unique pointer
[unique] graph_node * right; // unique pointer
} TREE_NODE_TYPE;
// application code:
short a = 5;
TREE_NODE_TYPE * t;
GRAPH_NODE_TYPE g, h;
g.pdata = h.pdata = &a;
t->left = &g;
t->right = &h;
// t->left->pdata == t->right->pdata == &a
尽管“t-left>”和“t-right>”指向唯一的内存位置,但“t-left-pdata>>”和“t-right-pdata>>”是别名。 因此,支持别名的算法必须遵循所有指针 (包括最终可能达到完整指针的唯一指针和引用指针) 。
示例
pointer_default(ptr)
typedef [ptr, string] unsigned char * MY_STRING_TYPE;
[ptr] char * MyFunction([in, out, unique] long * plNumber);
另请参阅