Прочитать на английском

Поделиться через


length_is - атрибут

Атрибут [length_is] указывает количество передаваемых элементов массива. Необходимо указать не отрицательное значение.

[length_is( limited-expression-list )]

Параметры

limited-expression-list

Задает одно или несколько выражений языка C. Каждое выражение вычисляется как целое число, представляющее количество передаваемых элементов массива. Компилятор MIDL поддерживает условные выражения, логические выражения, реляционные выражения и арифметические выражения. MIDL не допускает вызовы функций в выражениях и не допускает операторы приращения и декремента. Разделяйте несколько выражений запятыми.

Комментарии

Атрибут [length_is] определяет значение индексов массива, соответствующих атрибуту [last_is] , если не указан параметр [last_is] . Связь между этими индексами массива выглядит следующим образом: length = last - first + 1.

Атрибут [length_is] нельзя использовать одновременно с атрибутом [last_is] или атрибутом [string] .

Чтобы определить подсчитываемую строку с атрибутом [length_is] или [last_is] , используйте массив символов или указатель без атрибута [string] .

Использование константного выражения с атрибутом [length_is] является недопустимым использованием атрибута. Это является законным, но неэффективным и приведет к замедлению маршалинга кода.

Атрибуты [size_is] и [length_is] можно использовать вместе. При этом атрибут [size_is] управляет объемом памяти, выделенной для данных. Атрибут [length_is] указывает, сколько элементов передается. Объем памяти, указанный атрибутами [size_is] и [length_is] , не должен совпадать. Например, клиент может передать параметр [in, out] на сервер и указать выделение большого объема памяти с помощью [size_is], даже если он указывает небольшое количество элементов данных, передаваемых с помощью [length_is]. Это позволяет серверу заполнять массив большими данными, чем он получил, которые затем он может отправить обратно клиенту.

Как правило, не рекомендуется указывать параметры [size_is] и [length_is] в параметрах [in] или [out] . В обоих случаях [size_is] управляет выделением памяти. Приложение может использовать [size_is] для выделения большего количества элементов массива, чем передается (как указано в [length_is]). Однако это было бы неэффективно. Кроме того, было бы неэффективно указывать одинаковые значения для [size_is] и [length_is]. Так как это приведет к дополнительным издержкам при маршалинге параметров. Если значения [size_is] и [length_is] всегда одинаковы, опустите атрибут [length_is] .

Примеры

/* 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]);

См. также раздел

Атрибуты поля

first_is

Файл определения интерфейса (IDL)

last_is

max_is

min_is

size_is

строка