Eindeutiges Attribut
Das [ eindeutige ] Attribut gibt einen eindeutigen Zeiger an.
pointer_default(unique)
typedef [ unique [[ , type-attribute-list ]] ] type-specifier declarator-list;
typedef struct-or-union-declarator
{
[ unique [[ , field-attribute-list ]] ] type-specifier declarator-list;
...}
[ unique [[ , function-attribute-list ]] ] type-specifier ptr-decl function-name(
[[ [ parameter-attribute-list ] ]] type-specifier [[declarator]]
, ...);
[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
[ unique [[ , parameter-attribute-list ]] ] type-specifier [[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; und das ] [ _ Kontexthandleder Verwendungsattribute ] , [ Zeichenfolge ] und [ ignorieren ] . Trennen Sie mehrere Attribute durch Kommas.
-
Typspezifizierer
-
Gibt einen Basistyp, eine Struktur, einen Union-, Enumerations- oder Typbezeichner an. Eine optionale Speicherspezifikation kann dem Typspezifizierer vorangestellt werden.
-
deklarator und declarator-list
-
Gibt C-Standarddeklaratoren an, z. B. Bezeichner, Zeigerdeklaratoren und Arraydeklaratoren. 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 Parameternamenbezeichner im Funktionsdeklarator ist optional.
-
struct-or-union-declarator
-
Gibt eine MIDL-Struktur oder einen Union-Deklarator an.
-
field-attribute-list
-
Gibt null oder mehr Feldattribute an, die für den Strukturmember, union-Member oder Funktionsparameter gelten. Gültige Feldattribute [ sind: zuerst _ ist ] , der letzte [ _ ist ] , die Länge [ _ ist ] , max [ _ ist ] , die Größe [ _ ist ] ; die Verwendungsattribute [ Zeichenfolge ], [ ignorieren ] und [ _ ] Kontexthandle; das Zeigerattribut [ ref ], [ eindeutig ] oder [ ptr ]; und der [ Union-Attributwechseltyp _ ]. 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, ] [ eindeutig ] oder [ ptr ] und die Verwendungsattribute [ Zeichenfolge ], [ ignorieren ] und [ _ Kontexthandle ].
-
ptr-decl
-
Gibt mindestens einen Zeigerdeklarator an, für den das [ eindeutige ] Attribut gilt. Ein Zeigerdeklarator entspricht dem in C verwendeten Zeigerdeklarator. sie wird aus dem * Bezeichner, Modifizierern wie far und dem Qualifizierer consterstellt.
-
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 direktionalen Attribute [ in ] und [ out ] aufnehmen. Die Feldattribute [ sind zuerst _ ], die letzte [ _ ist ], die Länge ist , max [ _ ] [ _ ] ist, die Größe [ _ ist ], und der [ _ Schaltertyp, ] das Zeigerattribut [ ref, ] eindeutig oder ptr;und das [ _ Kontexthandle ] der Verwendungsattribute und die [ Zeichenfolge ]. Das Verwendungsattribut [ ignore ] kann nicht als Parameterattribut verwendet werden. Trennen Sie mehrere Attribute durch Kommas.
Bemerkungen
Zeigerattribute können als Typattribut angewendet werden. als Feldattribut, das für einen Strukturmember, union-Member oder Parameter gilt; oder als Funktionsattribut, das für den Funktionsrückgabetyp gilt. Das Zeigerattribut kann auch mit dem [ _ Zeigerstandardschlüsselwort angezeigt ] werden.
Ein eindeutiger Zeiger weist die folgenden Merkmale auf:
- Kann den Wert NULL aufweisen.
- Kann während eines Aufrufs von NULL in nicht NULL, von ungleich NULL in NULL oder von einem Wert ungleich NULL in einen anderen geändert werden.
- Kann neuen Arbeitsspeicher auf dem Client zuordnen. Wenn der eindeutige Zeiger von NULL in nicht NULL geändert wird, werden die vom Server zurückgegebenen Daten in den neuen Speicher geschrieben.
- Kann vorhandenen Arbeitsspeicher auf dem Client verwenden, ohne neuen Arbeitsspeicher zu belegen. Wenn sich ein eindeutiger Zeiger während eines Aufrufs von einem Wert ungleich NULL in einen anderen ändert, wird davon ausgegangen, dass der Zeiger auf ein Datenobjekt desselben Typs zeigt. Vom Server zurückgegebene Daten werden in vorhandenen Speicher geschrieben, der durch den Wert des eindeutigen Zeigers vor dem Aufruf angegeben wird.
- Kann den Arbeitsspeicher auf dem Client verwaist. Arbeitsspeicher, auf den von einem eindeutigen Zeiger ungleich NULL verwiesen wird, wird möglicherweise nie freigegeben, wenn der eindeutige Zeiger während eines Aufrufs in NULL geändert wird und der Client keine andere Möglichkeit zum Dereferenzieren des Speichers hat.
- Verursacht kein Aliasing. Wie der Speicher, auf den ein Verweiszeiger zeigt, kann der Speicher, auf den ein eindeutiger Zeiger zeigt, nicht über einen anderen Namen in der Funktion erreicht werden.
Die Stubs rufen die vom Benutzer bereitgestellten Speicherverwaltungsfunktionen midl _ user _ allocate und midl _ user _ free auf, um Denk- und Zuordnungsspeicher frei zuzuweisen, der für eindeutige Zeiger und deren Verweise erforderlich ist.
Die folgenden Einschränkungen gelten für eindeutige Zeiger:
- Das [ eindeutige ] Attribut kann nicht auf Bindungshandleparameter ( handle _ t) und Kontexthandleparameter angewendet werden.
- Das [ eindeutige ] Attribut kann nicht auf [ ] out-only-Zeigerparameter der obersten Ebene angewendet werden (Parameter, die nur über das [ ] richtungsorientierte Out-Attribut verfügen).
- Standardmäßig sind Zeiger der obersten Ebene in Parameterlisten [ ] Verweiszeiger. Dies gilt auch dann, wenn die Schnittstelle den Zeiger _ default(unique) angibt. Parameter der obersten Ebene in Parameterlisten müssen mit dem [ ] unique-Attribut angegeben werden, um ein eindeutiger Zeiger zu sein.
- Eindeutige Zeiger können nicht verwendet werden, um die Größe eines Arrays oder Union-Arm zu beschreiben, da eindeutige Zeiger den Wert NULL aufweisen können. Diese Einschränkung verhindert den Fehler, der auftritt, wenn ein NULL-Wert als Arraygröße oder Union-Arm-Größe verwendet wird.
Beispiele
pointer_default(unique)
typedef [unique, string] unsigned char * MY_STRING_TYPE;
[unique] char * MyFunction([in, out, unique] long * plNumber);