Condividi tramite


ptr (attributo)

L'attributo [ptr] designa un puntatore come puntatore 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]]
    , ...);

Parametri

type-attribute-list

Specifica uno o più attributi che si applicano al tipo. Gli attributi di tipo validi includono [handle], [switch_type], [transmit_as]; l'attributo puntatore [ref], [unique, o [ptr]; e gli attributi di utilizzo [context_handle],[string]e [ignore]. Separare più attributi con virgole.

identificatore di tipo

Specifica un tipo di base, uno struct, un'unione o un tipo di enumerazione o un identificatore di tipo. Una specifica di archiviazione facoltativa può precedere l'identificatore di tipo.

dichiaratore standard

Specifica un dichiaratore C standard, ad esempio un identificatore, un dichiaratore puntatore o un dichiaratore di matrice. Per altre informazioni, vedere Matrice e Sized-Pointer attributi, matrici e matrici e puntatori.

declarator-list

Specifica i dichiaratori C standard, ad esempio identificatori, dichiaratori di puntatore e dichiaratori di matrice. Per altre informazioni, vedere Matrice e Sized-Pointer attributi, matrici e matrici e puntatori. L'elenco dichiaratore è costituito da uno o più dichiaratori separati da virgole. L'identificatore del nome del parametro nel dichiaratore di funzioni è facoltativo.

field-attribute-list

Specifica zero o più attributi di campo che si applicano alla struttura o al parametro membro o funzione dell'unione. Gli attributi di campo validi includono [first_is], [last_is], [length_is],[max_is], [size_is]; gli attributi di utilizzo [string], [ignore]e [context_handle]; attributo puntatore [ref], [unique]o [ptr]; e l'attributo union [switch_type]. Separare più attributi di campo con virgole.

function-attribute-list

Specifica zero o più attributi che si applicano alla funzione. Gli attributi di funzione validi sono [callback], [local]; attributo puntatore [ref], [unique]o [ptr]; e gli attributi di utilizzo [string], [ignore]e [context_handle].

ptr-decl

Specifica almeno un dichiaratore puntatore a cui si applica l'attributo [ptr]. Un dichiaratore puntatore è lo stesso del dichiaratore puntatore usato in C; viene costruito dal designatore *, modificatori come la lontano e il qualificatore const.

nome funzione

Specifica il nome della routine remota.

parameter-attribute-list

È costituito da zero o più attributi appropriati per il tipo di parametro specificato. Gli attributi dei parametri possono accettare gli attributi direzionali in e fuori; gli attributi del campo first_is, last_is, length_is, max_is, size_is e switch_type; attributo puntatore ref, univoco o [ptr]; e gli attributi di utilizzo context_handle e stringa. Impossibile usare l'attributo di utilizzo come attributo di parametro. Separare più attributi con virgole.

Commenti

Il puntatore completo designato dall'attributo [ptr] avvicina la funzionalità completa del puntatore del linguaggio C. Il puntatore completo può avere il valore NULL e può cambiare durante la chiamata da NULL a non NULL. L'archiviazione puntata da puntatori completi può essere raggiunta da altri nomi nell'applicazione che supporta l'aliasing e i cicli. Questa funzionalità richiede un sovraccarico maggiore durante una chiamata di procedura remota per identificare i dati a cui fa riferimento il puntatore, determinare se il valore è NULL e per individuare se due puntatori puntano allo stesso dati.

Usare puntatori completi per:

  • Valori restituiti remoti.
  • Puntatori doppie, quando le dimensioni di un parametro di output non sono note.
  • Puntatori NULL.

I puntatori completi (e univoci) non possono essere usati per descrivere le dimensioni di una matrice o di un'unione perché questi puntatori possono avere il valore NULL. Questa restrizione di MIDL impedisce un errore che può causare quando viene usato un valore NULL come dimensione.

Si presuppone che i puntatori di riferimento e univoci non causano l'aliasing dei dati. Un grafico diretto ottenuto partendo da un puntatore univoco o di riferimento e seguendo solo puntatori univoci o di riferimento contiene né riconvergence né cicli.

Per evitare l'aliasing, tutti i valori del puntatore devono essere ottenuti da un puntatore di input della stessa classe di puntatore. Se più puntatori puntano alla stessa posizione di memoria, tutti questi puntatori devono essere puntatori completi.

In alcuni casi, i puntatori completi e univoci possono essere misti. Un puntatore completo può essere assegnato il valore di un puntatore univoco, purché l'assegnazione non viola le restrizioni sulla modifica del valore di un puntatore univoco. Tuttavia, quando si assegna un puntatore univoco il valore di un puntatore completo, è possibile che venga generato l'aliasing.

La combinazione di puntatori completi e univoci può causare l'aliasing, come illustrato nell'esempio seguente:

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

Anche se "t-left" e "t-right>" puntano a posizioni di memoria univoche, "t-left-pdata>>" e "t-right-pdata>>>" sono alias. Per questo motivo, gli algoritmi di aliasing-support devono seguire tutti i puntatori (inclusi puntatori univoci e di riferimento) che potrebbero raggiungere un puntatore completo.

Esempi

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

Vedere anche

Matrici

Matrici e puntatori

Attributi di matrice e Sized-Pointer

Tipi di base MIDL

callback

const

context_handle

Enum

first_is

Gestire

File IDL (Interface Definition)

Ignorare

last_is

length_is

Locale

max_is

pointer_default

Ref

size_is

string

Struct

switch_type

transmit_as

Unione

Unico