Auf Englisch lesen

Freigeben über


size_is-Attribut

Verwenden Sie das [size_is]-Attribut, um die Größe des Arbeitsspeichers in Elementen anzugeben, die für die Größe von Zeigern, größenzeiger Zeiger und einzelne oder mehrdimensionale Arrays zugeordnet sind.

[ size_is(limited-expression-list) ]

Parameter

limited-expression-list

Gibt mindestens einen C-Sprachausdruck an. Jeder Ausdruck wird mit einer nicht negativen ganzzahligen Zahl ausgewertet, die die Menge des Arbeitsspeichers darstellt, der einem großen Zeiger oder einem Array zugeordnet ist. Gibt im Fall eines Arrays einen einzelnen Ausdruck an, der die Zuordnungsgröße in Elementen der ersten Dimension dieses Arrays darstellt. Der MIDL-Compiler unterstützt bedingte Ausdrücke, logische Ausdrücke, relationale Ausdrücke und arithmetische Ausdrücke. MIDL lässt keine Funktionsaufrufe in Ausdrücken zu und lässt keine Inkrement- und Dekrementoperatoren zu. Verwenden Sie Kommas als Platzhalter für implizite Parameter oder zum Trennen mehrerer Ausdrücke.

Bemerkungen

Wenn Sie das [size_is]-Attribut verwenden, um Arbeitsspeicher für ein mehrdimensionales Array zuzuweisen, und Sie array [ ] Notation verwenden, denken Sie daran, dass nur die erste Dimension eines mehrdimensionalen Arrays zur Laufzeit dynamisch bestimmt werden kann. Die anderen Dimensionen müssen statisch angegeben werden. Weitere Informationen zur Verwendung des Attributs [size_is] mit mehreren Zeigerebenen, damit ein Server ein Datenarray mit dynamischer Größe an einen Client zurückgeben kann, wie im Beispiel Proc7 gezeigt, finden Sie unter Mehrere Zeigerebenen.

Sie können entweder [size_is] oder max_is (aber nicht beide in derselben Attributliste) verwenden, um die Größe eines Arrays anzugeben, dessen Obergrenzen zur Laufzeit bestimmt werden. Beachten Sie jedoch, dass das Attribut [size_is] nicht für festgelegte Arraydimensionen verwendet werden kann. Das [max_is]-Attribut gibt den maximal gültigen Arrayindex an. Daher entspricht die Angabe von [size_is(n)] der Angabe von [max_is(n-1)].

Ein [ in] - oder [in, out]-konformer Parameter mit dem [ string]-Attribut muss nicht über das [size_is]- oder [max_is]-Attribut verfügen. In diesem Fall wird die Größe der Zuordnung aus dem NULL-Abschlussator der Eingabezeichenfolge bestimmt. Alle anderen konformen Arrays mit dem [string]-Attribut müssen über ein [size_is]- oder [max_is]-Attribut verfügen.

Obwohl es legal ist, das Attribut [size_is] mit einer Konstante zu verwenden, ist dies ineffizient und unnötig. Verwenden Sie beispielsweise ein Array mit fester Größe:

HRESULT Proc3([in] short Arr[MAX_SIZE]);

Anstelle von:

// legal but marshaling code is much slower
HRESULT Proc3([in size_is(MAX_SIZE)] short Arr[] );

Sie können die Attribute [size_is] und [length_is] zusammen verwenden. Wenn Sie dies tun, steuert das Attribut [size_is] die Menge des für die Daten zugewiesenen Arbeitsspeichers. Das Attribut [length_is] gibt an, wie viele Elemente übertragen werden. Die durch die Attribute [size_is] und [length_is] angegebene Arbeitsspeichermenge muss nicht identisch sein. Für instance kann Ihr Client einen [in,out]-Parameter an einen Server übergeben und eine große Speicherzuordnung mit [size_is] angeben, obwohl er eine kleine Anzahl von Datenelementen angibt, die mit [length_is] übergeben werden sollen. Dadurch kann der Server das Array mit mehr Daten füllen, als er empfangen hat, die er dann an den Client zurücksenden kann.

Im Allgemeinen ist es nicht sinnvoll, sowohl [size_is] als auch [length_is] für [ein]- oder [out]-Parameter anzugeben. In beiden Fällen steuert [size_is] die Speicherzuordnung. Ihre Anwendung könnte [size_is] verwenden, um mehr Arrayelemente zuzuweisen, als sie überträgt (gemäß [length_is]). Dies wäre jedoch ineffizient. Es wäre auch ineffizient, identische Werte für [size_is] und [length_is] anzugeben. Dies würde zusätzlichen Mehraufwand während des Parameter marshalings verursachen. Wenn die Werte von [size_is] und [length_is] immer identisch sind, lassen Sie das [length_is]-Attribut weg.

Beispiele

HRESULT Proc1(
    [in] short m;
    [in, size_is(m)] short a[]);  // If m = 10, a[10]
HRESULT Proc2(
    [in] short m;
    [in, size_is(m)] short b[][20]);  // If m = 10, b[10][20]
HRESULT Proc3(
    [in] short m;
    [size_is(m)] short * pshort); /* Specifies a pointer
                                  to an m-sized block of shorts */
HRESULT Proc4(
    [in] short m;
    [size_is( , m)] short ** ppshort); /* Specifies a pointer 
                                       to a pointer to an m-sized 
                                       block of shorts */
HRESULT Proc5(
    [in] short m;
    [size_is(m ,)] short ** ppshort); /* Specifies an
                                      m-sized block of pointers 
                                      to shorts */
HRESULT Proc6(
    [in] short m;
    [in] short n;
    [size_is(m,n)] short ** ppshort); /* Specifies a pointer to an 
                                      m-sized block of pointers, each 
                                      of which points to an n-sized 
                                      block of shorts. m associates with
                                      the pointer closeest to the identifer
                                      it decorates. n associates with rest.*/
 HRESULT Proc7(
     [out] long  * pSize,
     [out, size_is( , *pSize)] my_type ** ppMyType); /* Specifies a pointer 
                                              to a sized pointer, 
                                              which points to a block 
                                              of my_types, whose size is
                                              unknown when the stub 
                                              calls the server. */

Weitere Informationen

Arrays

Feldattribute

first_is

IDL-Datei (Interface Definition)

in

last_is

length_is

max_is

min_is

out

Zeichenfolge