Freigeben über


ptr-Attribut

Das [ptr] -Attribut gibt einen Zeiger als vollständigen Zeiger an.

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

Parameter

type-attribute-list

Gibt mindestens ein Attribut an, das für den Typ gilt. Gültige Typattribute sind [handle], [switch_type], [transmit_as]; das Zeigerattribute [ref], [unique oder [ptr]; und die Verwendungsattribute [context_handle], [string] und [ignorieren]. Trennen Sie mehrere Attribute durch Kommas.

Typspezifizierer

Gibt einen Basistyp, eine Struktur, einen Union- oder Enumerationstyp oder einen Typbezeichner an. Eine optionale Speicherspezifikation kann dem Typbezeichner vorangestellt werden.

Standarddeklarator

Gibt einen C-Standard-Deklarator an, z. B. einen Bezeichner, einen Zeiger-Deklarator oder einen Array-Deklarator. Weitere Informationen finden Sie unter Array- und Sized-Pointer Attribute, Arrays und Arrays und Zeiger.

deklarator-list

Gibt Standard-C-Deklaratoren an, z. B. Bezeichner, Zeiger-Deklaratoren und Array-Deklaratoren. Weitere Informationen finden Sie unter Array- und Sized-Pointer Attribute, Arrays und Arrays und Zeiger. Die Deklaratorliste besteht aus einem oder mehreren Deklaratoren, die durch Kommas getrennt sind. Der Parameternamebezeichner im Funktionsdeklarator ist optional.

field-attribute-list

Gibt null oder mehr Feldattribute an, die für die Struktur, den Unionselement oder den Funktionsparameter gelten. Gültige Feldattribute sind [first_is], [last_is], [length_is], [max_is], [size_is]; die Verwendungsattribute [Zeichenfolge], [ignorieren] und [context_handle]; das Zeigerattribute [ref], [unique] oder [ptr]; und das Union-Attribut [switch_type]. Trennen Sie mehrere Feldattribute durch Kommas.

function-attribute-list

Gibt null oder mehr Attribute an, die für die Funktion gelten. Gültige Funktionsattribute sind [Rückruf], [lokal]; das Zeigerattribute [ref], [unique] oder [ptr]; und die Verwendungsattribute [Zeichenfolge], [ignorieren] und [context_handle].

ptr-decl

Gibt mindestens einen Zeigerdeklarator an, für den das [ptr] -Attribut gilt. Ein Zeigerdeklarations-Deklarator ist mit dem in C verwendeten Zeiger-Deklarator identisch. es wird aus dem *-Designator, Modifizierern wie far und dem Qualifizierer const erstellt.

Funktionsname

Gibt den Namen der Remoteprozedur an.

parameter-attribute-list

Besteht aus null oder mehr Attributen, die für den angegebenen Parametertyp geeignet sind. Parameterattribute können die Richtungsattribute ein- und ausnehmen. die Feldattribute first_is, last_is, length_is, max_is, size_is und switch_type; das Zeigerattribute ref, unique oder [ptr]; und die Verwendungsattribute context_handle und Zeichenfolge. Das Verwendungsattribut ignore kann nicht als Parameterattribute verwendet werden. Trennen Sie mehrere Attribute durch Kommas.

Bemerkungen

Der vollständige Zeiger, der durch das [ptr] -Attribut festgelegt ist, nähert sich der vollen Funktionalität des C-Sprachzeigers. Der vollständige Zeiger kann den Wert NULL aufweisen und kann sich während des Aufrufs von NULL in non-NULL ändern. Speicher, auf den durch vollständige Zeiger verwiesen wird, kann von anderen Namen in der Anwendung erreicht werden, die Aliasing und Zyklen unterstützen. Diese Funktionalität erfordert mehr Mehraufwand während eines Remoteprozeduraufrufs, um die daten zu identifizieren, auf die durch den Zeiger verwiesen wird, zu bestimmen, ob der Wert NULL ist, und um zu ermitteln, ob zwei Zeiger auf dieselben Daten zeigen.

Verwenden Sie vollständige Zeiger für:

  • Remoterückgabewerte.
  • Doppelte Zeiger, wenn die Größe eines Ausgabeparameters nicht bekannt ist.
  • NULL-Zeiger .

Vollständige (und eindeutige) Zeiger können nicht verwendet werden, um die Größe eines Arrays oder einer Union zu beschreiben, da diese Zeiger den Wert NULL aufweisen können. Diese Einschränkung durch MIDL verhindert einen Fehler, der auftreten kann, wenn ein NULL-Wert als Größe verwendet wird.

Es wird davon ausgegangen, dass Verweis- und eindeutige Zeiger kein Aliasing von Daten verursachen. Ein gerichtetes Diagramm, das durch den Beginn eines eindeutigen Zeigers oder eines Referenzzeigers erhalten wird und nur eindeutigen oder Referenzzeigern folgt, enthält weder Rückkonvergenz noch Zyklen.

Um Aliase zu vermeiden, sollten alle Zeigerwerte aus einem Eingabezeiger derselben Zeigerklasse abgerufen werden. Wenn mehr als ein Zeiger auf denselben Speicherspeicherort zeigt, müssen alle diese Zeiger vollzeiger sein.

In einigen Fällen können vollständige und eindeutige Zeiger gemischt werden. Einem vollständigen Zeiger kann der Wert eines eindeutigen Zeigers zugewiesen werden, solange die Zuweisung nicht gegen die Einschränkungen zum Ändern des Werts eines eindeutigen Zeigers verstößt. Wenn Sie jedoch einem eindeutigen Zeiger den Wert eines vollständigen Zeigers zuweisen, können Sie Aliasing verursachen.

Das Mischen von vollständigen und eindeutigen Zeigern kann zu Aliasing führen, wie im folgenden Beispiel veranschaulicht:

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

Obwohl "t-left>" und "t-right>" auf eindeutige Speicherorte verweisen, werden "t-left-pdata>>" und "t-right-pdata>>" aliast. Aus diesem Grund müssen Aliasingunterstützungsalgorithmen alle Zeiger (einschließlich eindeutiger und Verweiszeiger) befolgen, die möglicherweise einen vollständigen Zeiger erreichen.

Beispiele

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

Weitere Informationen

Arrays

Arrays und Zeiger

Array- und Sized-Pointer attribute

MIDL-Basistypen

Rückruf

const

context_handle

Enum

first_is

Behandeln

IDL-Datei (Interface Definition)

Ignorieren

last_is

length_is

lokal

max_is

pointer_default

Ref

size_is

Schnur

Struktur

switch_type

transmit_as

union

Einzigartige