atributo ptr
O atributo [ptr] designa um ponteiro como um ponteiro 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 um ou mais atributos que se aplicam ao tipo . Os atributos de tipo válidos incluem [handle], [switch_type], [transmit_as]; o atributo de ponteiro [ref], [unique ou [ptr]; e os atributos de uso [context_handle], [string], e [ignore]. Separe vários atributos com vírgulas.
-
type-specifier
-
Especifica um tipo base, struct, união ou tipo de enumeração ou identificador de tipo. Uma especificação de armazenamento opcional pode preceder o especificador de tipo.
-
declarador padrão
-
Especifica um declarador C padrão, como um identificador, um declarador de ponteiro ou um declarador de matriz. Para obter mais informações, consulte Atributos de matriz e Sized-Pointer, matrizes e matrizes e ponteiros.
-
declarator-list
-
Especifica declaradores C padrão, como identificadores, declaradores de ponteiro e declaradores de matriz. Para obter mais informações, consulte Atributos de matriz e Sized-Pointer, matrizes e matrizes e ponteiros. A lista de declaradores consiste em um ou mais declaradores separados por vírgulas. O identificador parameter-name no declarador de função é opcional.
-
field-attribute-list
-
Especifica zero ou mais atributos de campo que se aplicam ao parâmetro de estrutura ou membro de união ou função. Os atributos de campo válidos incluem [first_is], [last_is], [length_is], [max_is], [size_is]; os atributos de uso [string], [ignore]e [context_handle]; o atributo de ponteiro [ref], [unique]ou [ptr]; e o atributo union [switch_type]. Separe vários atributos de campo com vírgulas.
-
function-attribute-list
-
Especifica zero ou mais atributos que se aplicam à função. Os atributos de função válidos são [retorno de chamada], [local]; o atributo de ponteiro [ref], [unique]ou [ptr]; e os atributos de uso [string], [ignore], e [context_handle].
-
ptr-decl
-
Especifica pelo menos um declarador de ponteiro ao qual o atributo [ptr] se aplica. Um declarador de ponteiro é o mesmo que o declarador de ponteiro usado em C; ele é construído a partir do designador * , modificadores como , por exemplo, e o qualificador const.
-
function-name
-
Especifica o nome do procedimento remoto.
-
parameter-attribute-list
-
Consiste em zero ou mais atributos apropriados para o tipo de parâmetro especificado. Os atributos de parâmetro podem levar os atributos direcionais para dentro e para fora; os atributos de campo first_is, last_is, length_is, max_is, size_is e switch_type; o atributo de ponteiro ref, unique ou [ptr]; e os atributos de uso context_handle e cadeia de caracteres. O atributo de uso ignore não pode ser usado como um atributo de parâmetro. Separe vários atributos com vírgulas.
Comentários
O ponteiro completo designado pelo atributo [ptr] aborda a funcionalidade completa do ponteiro da linguagem C. O ponteiro completo pode ter o valor NULL e pode ser alterado durante a chamada de NULL para não NULL. O armazenamento apontado por ponteiros completos pode ser alcançado por outros nomes no aplicativo que dão suporte a alias e ciclos. Essa funcionalidade requer mais sobrecarga durante uma chamada de procedimento remoto para identificar os dados referenciados pelo ponteiro, determinar se o valor é NULL e descobrir se dois ponteiros apontam para os mesmos dados.
Use ponteiros completos para:
- Valores de retorno remotos.
- Ponteiros duplos, quando o tamanho de um parâmetro de saída não é conhecido.
- Ponteiros NULL .
Ponteiros completos (e exclusivos) não podem ser usados para descrever o tamanho de uma matriz ou união porque esses ponteiros podem ter o valor NULL. Essa restrição por MIDL impede um erro que pode resultar quando um valor NULL é usado como o tamanho.
Supõe-se que ponteiros de referência e exclusivos não causem nenhum alias de dados. Um grafo direcionado obtido começando de um ponteiro exclusivo ou de referência e seguindo apenas ponteiros exclusivos ou de referência não contém reconvergência nem ciclos.
Para evitar alias, todos os valores de ponteiro devem ser obtidos de um ponteiro de entrada da mesma classe de ponteiro. Se mais de um ponteiro apontar para o mesmo local de memória, todos esses ponteiros deverão ser ponteiros completos.
Em alguns casos, ponteiros completos e exclusivos podem ser misturados. Um ponteiro completo pode ser atribuído ao valor de um ponteiro exclusivo, desde que a atribuição não viole as restrições de alteração do valor de um ponteiro exclusivo. No entanto, quando você atribui um ponteiro exclusivo ao valor de um ponteiro completo, pode causar alias.
Misturar ponteiros completos e exclusivos pode causar alias, conforme demonstrado no exemplo a seguir:
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
Embora "t-left>" e "t-right>" apontem para locais de memória exclusivos, "t-left-pdata>>" e "t-right-pdata>>" são alias. Por esse motivo, os algoritmos de suporte a aliasing devem seguir todos os ponteiros (incluindo ponteiros exclusivos e de referência) que podem eventualmente alcançar um ponteiro completo.
Exemplos
pointer_default(ptr)
typedef [ptr, string] unsigned char * MY_STRING_TYPE;
[ptr] char * MyFunction([in, out, unique] long * plNumber);
Confira também