Eindeutiges Attribut
Das [unique] -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]]
, ...);
-
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], [Zeichenfolge] und [ignorieren]. Trennen Sie mehrere Attribute durch Kommas.
-
Typspezifizierer
-
Gibt einen Basistyp, eine Struktur, eine Union, einen Enumerationstyp oder einen Typbezeichner an. Eine optionale Speicherspezifikation kann dem Typbezeichner vorangestellt werden.
-
deklarator und 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.
-
struct-or-union-deklarator
-
Gibt eine MIDL-Struktur oder einen Union-Deklarator an.
-
field-attribute-list
-
Gibt null oder mehr Feldattribute an, die für den Strukturmember, den Union-Member oder den Funktionsparameter gelten. Gültige Feldattribute sind [first_is], [last_is], [length_is], [max_is], [size_is]; die Verwendungsattribute [string], [ignore] 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 Attribut [unique] 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 [in] und [out]; die Feldattribute [first_is], [last_is], [length_is], [max_is], [size_is] und [switch_type]; das Zeigerattribute [ref], eindeutig oder ptr; und die Nutzungsattribute [context_handle] und [Zeichenfolge]. Das Verwendungsattribut [ignore] kann nicht als Parameterattribute verwendet werden. Trennen Sie mehrere Attribute durch Kommas.
Zeigerattribute können als Typattribute angewendet werden. als Feldattribute, das für ein Strukturelement, ein Unionmitglied oder einen Parameter gilt; oder als Funktionsattribute, das für den Funktionsrückgabetyp gilt. Das Zeigerattribute kann auch mit dem [pointer_default] Schlüsselwort (keyword) angezeigt werden.
Ein eindeutiger Zeiger weist die folgenden Merkmale auf:
- Kann den Wert NULL aufweisen.
- Kann während eines Aufrufs von NULL in non-NULL, von non-NULL in NULL oder von einem Nicht-NULL-Wert in einen anderen geändert werden.
- Kann neuen Arbeitsspeicher auf dem Client zuweisen. Wenn sich der eindeutige Zeiger von NULL in nicht NULL ändert, werden die vom Server zurückgegebenen Daten in den neuen Speicher geschrieben.
- Kann vorhandenen Arbeitsspeicher auf dem Client verwenden, ohne neuen Arbeitsspeicher zuzuweisen. Wenn sich ein eindeutiger Zeiger während eines Aufrufs von einem Nicht-NULL-Wert in einen anderen ändert, wird davon ausgegangen, dass der Zeiger auf ein Datenobjekt desselben Typs zeigt. Vom Server zurückgegebene Daten werden in den vorhandenen Speicher geschrieben, der durch den Wert des eindeutigen Zeigers vor dem Aufruf angegeben wird.
- Kann arbeitsspeicher auf dem Client verwaist werden. Arbeitsspeicher, auf den durch einen eindeutigen Zeiger ohne NULL verwiesen wird, wird möglicherweise nie freigegeben, wenn sich der eindeutige Zeiger während eines Aufrufs in NULL ändert und der Client keine andere Möglichkeit zum Deferencing des Speichers hat.
- Führt nicht zu Aliasing. Wie der Speicher, auf den ein Verweiszeiger verweist, kann der Speicher, auf den ein eindeutiger Zeiger verweist, von keinem anderen Namen in der Funktion erreicht werden.
Die Stubs rufen die vom Benutzer bereitgestellten Speicherverwaltungsfunktionen midl_user_allocate und midl_user_free auf, um den für eindeutige Zeiger und deren Referenten erforderlichen Arbeitsspeicher zuzuordnen und zuzuordnen.
Die folgenden Einschränkungen gelten für eindeutige Zeiger:
- Das Attribut [unique] kann nicht auf Bindungshandleparameter ( handle_t) und Kontexthandleparameter angewendet werden.
- Das [eindeutige] Attribut kann nicht auf [out]-only-Zeigerparameter der obersten Ebene (Parameter, die nur das [out] -Richtungsattribut aufweisen) angewendet werden.
- Standardmäßig sind Zeiger der obersten Ebene in Parameterlisten [ref] -Zeiger. Dies gilt auch dann, wenn die Schnittstelle pointer_default(eindeutig) angibt. Parameter der obersten Ebene in Parameterlisten müssen mit dem Attribut [unique] angegeben werden, um ein eindeutiger Zeiger zu sein.
- Eindeutige Zeiger können nicht verwendet werden, um die Größe eines Arrays oder Unionarms zu beschreiben, da eindeutige Zeiger den Wert NULL aufweisen können. Diese Einschränkung verhindert den Fehler, der entsteht, wenn ein NULL-Wert als Arraygröße oder Union-Arm-Größe verwendet wird.
pointer_default(unique)
typedef [unique, string] unsigned char * MY_STRING_TYPE;
[unique] char * MyFunction([in, out, unique] long * plNumber);