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]]
    , ...);

Parámetros

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.

Comentarios

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.

Ejemplos

pointer_default(ptr) 
 
typedef [ptr, string] unsigned char * MY_STRING_TYPE; 
 
[ptr] char * MyFunction([in, out, unique] long * plNumber);

Vea también

Matrices

Matrices y punteros

Atributos de matriz y Sized-Pointer

Tipos base MIDL

devolución de llamada

const

context_handle

Enum

first_is

Manejar

Archivo de definición de interfaz (IDL)

Ignorar

last_is

length_is

Local

max_is

pointer_default

Ref

size_is

Cadena

Estructura

switch_type

transmit_as

union

unique