ptr (atributo)
El atributo [ptr] designa un puntero como puntero completo.
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]]
, ...);
-
type-attribute-list
-
Especifica uno o varios atributos que se aplican al tipo. Los atributos de tipo válidos incluyen [handle], [switch_type], [transmit_as]; el atributo de puntero [ref], [unique o [ptr]; y los atributos de uso [context_handle], [string] y [ignore]. Separe varios atributos con comas.
-
type-specifier
-
Especifica un tipo base, una estructura, una unióno un identificador de tipo de tipo. Una especificación de almacenamiento opcional puede preceder al especificador de tipos.
-
declarador estándar
-
Especifica un declarador C estándar, como un identificador, un declarador de puntero o un declarador de matriz. Para obtener más información, vea Array and Sized-Pointer Attributes, arrays, and Arrays and Pointers.
-
declarator-list
-
Especifica declaradores de C estándar, como identificadores, declaradores de puntero y declaradores de matriz. Para obtener más información, vea Array and Sized-Pointer Attributes, arrays, and Arrays and Pointers. La lista declarator consta de uno o varios declaradores separados por comas. El identificador parameter-name del declarador de función es opcional.
-
field-attribute-list
-
Especifica cero o más atributos de campo que se aplican a la estructura o al miembro de unión o al parámetro de función. Los atributos de campo válidos incluyen [first_is], [last_is], [length_is], [max_is], [size_is]; los atributos de uso [string], [ignore]y [context_handle]; el atributo de puntero [ref], [unique], o [ptr]; y el atributo de unión [switch_type]. Separe varios atributos de campo con comas.
-
function-attribute-list
-
Especifica cero o más atributos que se aplican a la función. Los atributos de función válidos son [devolución de llamada], [local]; el atributo de puntero [ref], [unique], o [ptr]; y los atributos de uso [string], [ignore]y [context_handle].
-
ptr-decl
-
Especifica al menos un declarador de puntero al que se aplica el atributo [ptr]. Un declarador de puntero es el mismo que el declarador de puntero utilizado en C; se construye a partir del designador * , modificadores como far y el calificador const.
-
function-name
-
Especifica el nombre del procedimiento remoto.
-
parameter-attribute-list
-
Consta de cero o más atributos adecuados para el tipo de parámetro especificado. Los atributos de parámetro pueden tomar los atributos direccionales dentro y fuera; los atributos de campo first_is, last_is, length_is, max_is, size_is y switch_type; el atributo de puntero ref, unique o [ptr]; y los atributos de uso context_handle y cadena. El atributo de uso omite no se puede usar como atributo de parámetro. Separe varios atributos con comas.
El puntero completo designado por el atributo [ptr] se aproxima a la funcionalidad completa del puntero del lenguaje C. El puntero completo puede tener el valor NULL y puede cambiar durante la llamada de NULL a no NULL. El almacenamiento al que apuntan los punteros completos se puede acceder mediante otros nombres de la aplicación que admiten alias y ciclos. Esta funcionalidad requiere más sobrecarga durante una llamada a procedimiento remoto para identificar los datos a los que hace referencia el puntero, determinar si el valor es NULL y detectar si dos punteros apuntan a los mismos datos.
Use punteros completos para:
- Valores devueltos remotos.
- Punteros dobles, cuando no se conoce el tamaño de un parámetro de salida.
- Punteros NULL .
Los punteros completos (y únicos) no se pueden usar para describir el tamaño de una matriz o unión porque estos punteros pueden tener el valor NULL. Esta restricción de MIDL evita un error que puede producir cuando se usa un valor NULL como tamaño.
Se supone que los punteros únicos y de referencia no provocan ningún alias de datos. Un gráfico dirigido obtenido a partir de un puntero único o de referencia y que solo sigue punteros únicos o de referencia no contiene ninguna reconvergencia ni ciclos.
Para evitar el alias, todos los valores de puntero deben obtenerse a partir de un puntero de entrada de la misma clase de puntero. Si más de un puntero apunta a la misma ubicación de memoria, todos estos punteros deben ser punteros completos.
En algunos casos, se pueden mezclar punteros completos y únicos. Se puede asignar un puntero completo al valor de un puntero único, siempre que la asignación no infrinja las restricciones al cambiar el valor de un puntero único. Sin embargo, al asignar un puntero único, el valor de un puntero completo puede provocar el alias.
La combinación de punteros completos y únicos puede provocar alias, como se muestra en el ejemplo siguiente:
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
Aunque "t-left>" y "t-right>" apuntan a ubicaciones de memoria únicas, "t-left-pdata>>" y "t-right-pdata>>" están alias. Por este motivo, los algoritmos de compatibilidad con alias deben seguir todos los punteros (incluidos los punteros únicos y de referencia) que pueden llegar finalmente a un puntero completo.
pointer_default(ptr)
typedef [ptr, string] unsigned char * MY_STRING_TYPE;
[ptr] char * MyFunction([in, out, unique] long * plNumber);