ptr-Attribut

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

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 ein oder mehrere Attribute an, die für den Typ gelten. Gültige Typattribute sind handle , switch type , transmit as , das [ ] [ _ ] [ _ ] Zeigerattribut [ ref, ] unique oder [ [ ptr ] sowie [ _ ] [ ] [ ] das Kontexthand handle für die Verwendungsattribute , string und ignore . Trennen Sie mehrere Attribute durch Kommas.

Typspezifizierer

Gibt einen Basistyp, eine Struktur,eine Unionoder einen enum-Typ oder Typbezeichner an. Eine optionale Speicherspezifikation kann dem Typspezifizierer vorangestellt werden.

Standarddeklarator

Gibt einen C-Standarddeklarator an, z. B. einen Bezeichner, einen Zeigerdeklarator oder einen Arraydeklarator. Weitere Informationen finden Sie unter Array- und Sized-Pointer Attribute, Arraysund Arrays und Zeiger.

declarator-list

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

Feldattributliste

Gibt null oder mehr Feldattribute an, die für den Struktur- oder Union-Member oder Funktionsparameter gelten. Zu den gültigen Feldattributen zählen zuerst ist , last ist , length ist , max ist , size ist ; die Verwendungsattribute string , ignore und context [ _handle; das ] [ _ ] [ _ ] [ _ ] [ _ ] [ ] [ ] [ _ ] Zeigerattribut [ ref, ] [ unique ] oder [ ptr ] und der Union-Attributschaltertyp [ _ ] . 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 , local, das [ ] [ ] Zeigerattribut [ ref, ] unique oder [ ] [ ] ptr und die Verwendungsattribute [ ] [ ] [ _ ] Zeichenfolge , ignorieren und Kontexthand handle .

ptr-decl

Gibt mindestens einen Zeigerdeklarator an, auf den das [ ptr-Attribut ] angewendet wird. Ein Zeigerdeklarator ist mit dem in C verwendeten Zeigerdeklarator identisch. sie wird aus dem * Designator, Modifizierern wie far und dem Qualifizierer const erstellt.

Funktionsname

Gibt den Namen der Remoteprozedur an.

parameter-attribute-list

Besteht aus 0 (null) oder mehr Attributen, die für den angegebenen Parametertyp geeignet sind. Parameterattribute können die direktionalen Attribute in und aus übernehmen. Die Feldattribute _sind zuerst , die letzte ist , _die Länge ist , _ max _ ist, die Größe ist , und der Switchtyp , _das Zeigerattribut ref, uniqueoder [ ptr ] und das Kontexthand handle und die Zeichenfolge der Verwendungsattribute _ . _ Das ignorierte Verwendungsattribut kann nicht als Parameterattribut verwendet werden. Trennen Sie mehrere Attribute durch Kommas.

Bemerkungen

Der vollständige Zeiger, der vom [ ] ptr-Attribut angegeben wird, nähert sich der vollständigen Funktionalität des C-Sprachzeigers. Der vollständige Zeiger kann den Wert NULL haben und sich während des Aufrufs von NULL in Nicht-NULL ändern. Storage, auf die von vollständigen Zeigern verwiesen wird, können durch andere Namen in der Anwendung erreicht werden, die Aliasing und Zyklen unterstützen. Diese Funktion erfordert mehr Aufwand während eines Remoteprozeduraufrufs, um die Daten zu identifizieren, auf die der Zeiger verwiesen wird, um 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:

  • Remote-Rü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 haben können. Diese Einschränkung durch MIDL verhindert einen Fehler, der bei Verwendung eines NULL-Werts als Größe entstehen kann.

Es wird davon ausgegangen, dass Verweis- und eindeutige Zeiger kein Aliasing von Daten verursachen. Ein gerichtetes Diagramm, das von einem eindeutigen - oder Verweiszeiger aus ermittelt wird und nur eindeutigen - oder Verweiszeigern folgt, enthält weder Reconvergence noch Zyklen.

Um Aliasing zu vermeiden, sollten alle Zeigerwerte von einem Eingabezeiger derselben Zeigerklasse erhalten werden. Wenn mehr als ein Zeiger auf denselben Speicherort zeigt, müssen alle diese Zeiger vollständige Zeiger 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 Kombinieren von vollständigen und eindeutigen Zeigern kann aliasing verursachen, wie im folgenden Beispiel gezeigt:

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 zeigen, werden "t->left->pdata" und "t->right->pdata" als Alias verwendet. Aus diesem Grund müssen Aliasing-Unterstützungsalgorithmen allen Zeigern (einschließlich eindeutiger und Referenzzeiger) folgen, die letztendlich einen vollständigen Zeiger erreichen können.

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- Sized-Pointer Attribute

MIDL-Basistypen

Rückruf

const

Kontexthand _ handle

Enum

first _ is

Handlebezeichner

IDL-Datei (Interface Definition)

Ignorieren

last _ is

length _ ist

lokal

max _ is

Zeiger _ standard

ref

size _ ist

Schnur

Struktur

_switch-Typ

übertragen _ als

union

Einzigartige