Atributo length_is

O atributo [length_is] especifica o número de elementos de matriz a serem transmitidos. Você deve especificar um valor não negativo.

[length_is( limited-expression-list )]

Parâmetros

limited-expression-list

Especifica uma ou mais expressões de linguagem C. Cada expressão é avaliada como um inteiro que representa o número de elementos de matriz a serem transmitidos. O compilador MIDL dá suporte a expressões condicionais, expressões lógicas, expressões relacionais e expressões aritméticas. MIDL não permite invocações de função em expressões e não permite operadores de incremento e decremento. Separe várias expressões com vírgulas.

Comentários

O atributo [length_is] determina o valor dos índices de matriz correspondentes ao atributo [last_is] quando [last_is] não é especificado. A relação entre esses índices de matriz é a seguinte: length = last - first + 1.

O atributo [length_is] não pode ser usado ao mesmo tempo que o atributo [last_is] ou o atributo [string] .

Para definir uma cadeia de caracteres contada com um atributo [length_is] ou [last_is] , use uma matriz de caracteres ou um ponteiro sem o atributo [string] .

Usar uma expressão constante com o atributo [length_is] é um uso inadequado do atributo. É legal, mas ineficiente e resultará em um código de marshaling mais lento.

Você pode usar os atributos [size_is] e [length_is] juntos. Quando você faz isso, o atributo [size_is] controla a quantidade de memória alocada para os dados. O atributo [length_is] especifica quantos elementos são transmitidos. A quantidade de memória especificada pelos atributos [size_is] e [length_is] não precisa ser a mesma. Por exemplo, seu cliente pode passar um parâmetro [in, out] para um servidor e especificar uma alocação de memória grande com [size_is], mesmo que ele especifique um pequeno número de elementos de dados a serem passados com [length_is]. Isso permite que o servidor preencha a matriz com mais dados do que recebeu, que ele pode enviar de volta para o cliente.

Em geral, não é útil especificar parâmetros [size_is] e [length_is] em parâmetros [in] ou [out] . Em ambos os casos, [size_is] controla a alocação de memória. Seu aplicativo pode usar [size_is] para alocar mais elementos de matriz do que transmite (conforme especificado por [length_is]). No entanto, isso seria ineficiente. Também seria ineficiente especificar valores idênticos para [size_is] e [length_is]. Porque isso criaria uma sobrecarga extra durante o marshaling de parâmetros. Quando os valores de [size_is] e [length_is] são sempre os mesmos, omita o atributo [length_is] .

Exemplos

/* counted string holding at most "size" characters */ 
typedef struct 
{ 
    unsigned short size; 
    unsigned short length; 
    [size_is(size), length_is(length)] char string[*]; 
 } COUNTED_STRING_TYPE; 
 
/* counted string holding at most 80 characters */ 
typedef struct 
{ 
    unsigned short length; 
    [length_is(length)] char string[80]; 
} STATIC_COUNTED_STRING_TYPE; 
 
HRESULT Proc1(
    [in] short iLength; 
    [in, length_is(iLength)] short asNumbers[10]);

Confira também

Atributos de campo

first_is

Arquivo IDL (Definição de Interface)

last_is

max_is

min_is

size_is

cadeia de caracteres