unique - атрибут

Атрибут [unique] задает уникальный указатель.

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

Указывает один или несколько атрибутов, применяемых к типу. Допустимые атрибуты типа: [handle], [switch_type], [transmit_as]; атрибут указателя [ref], [unique], или [ptr]; и атрибуты использования [context_handle], [string], и [ignore]. Разделите несколько атрибутов запятыми.

описатель типа

Задает базовый тип, структуру, объединение, тип перечисления или идентификатор типа. Необязательная спецификация хранилища может предшествовать описательу типа.

declarator и declarator-list

Задает стандартные деклараторы C, такие как идентификаторы, деклараторы указателей и деклараторы массива. Дополнительные сведения см. в разделе "Массив" и Sized-Pointer "Атрибуты", "Массивы", " Массивы" и "Указатели". Список деклараторов состоит из одного или нескольких деклараторов, разделенных запятыми. Идентификатор имени параметра в деклараторе функции является необязательным.

декларатор структуры или объединения

Указывает структуру MIDL или декларатор объединения .

field-attribute-list

Указывает ноль или больше атрибутов поля, применяемых к элементу структуры, члену объединения или параметру функции. Допустимые атрибуты полей: [first_is], [last_is], [length_is], [max_is], [size_is]; атрибуты использования [string], [ignore], и [context_handle]; атрибут указателя [ref], [unique], или [ptr]; и атрибут объединения [switch_type]. Разделите несколько атрибутов поля запятыми.

function-attribute-list

Указывает ноль или больше атрибутов, которые применяются к функции. Допустимые атрибуты функции: [callback], [local]; атрибут указателя [ref], [unique], или [ptr]; и атрибуты использования [string], [ignore], и [context_handle].

ptr-decl

Указывает по крайней мере один декларатор указателя, к которому применяется атрибут [unique] . Декларатор указателя совпадает с декларатором указателя, используемым в C; он создается на основе конструктора *, модификаторов, таких как даль, и константы квалификатора.

имя функции

Указывает имя удаленной процедуры.

parameter-attribute-list

Состоит из нуля или нескольких атрибутов, соответствующих указанному типу параметра. Атрибуты параметров могут принимать атрибуты направления [in] и [out]; атрибуты поля [first_is], [last_is], [length_is], [max_is], [size_is], и [switch_type]; атрибут указателя [ref], уникальный или ptr; и атрибуты использования [context_handle] и [string]. Атрибут использования [ignore] нельзя использовать в качестве атрибута параметра. Разделите несколько атрибутов запятыми.

Remarks

Атрибуты указателя можно применять как атрибут типа; как атрибут поля, который применяется к элементу структуры, члену объединения или параметру; или как атрибут функции, который применяется к типу возвращаемого значения функции. Атрибут указателя также может отображаться с ключевым словом [pointer_default] .

Уникальный указатель имеет следующие характеристики:

  • Может иметь значение NULL.
  • Может изменяться во время вызова с NULL на значение, отличное от NULL, отnon-NULL до NULL, или с одного значения, отличного от NULL, к другому.
  • Может выделить новую память на клиенте. При изменении уникального указателя с NULL на non-NULL данные, возвращаемые с сервера, записываются в новое хранилище.
  • Можно использовать существующую память на клиенте без выделения новой памяти. При изменении уникального указателя во время вызова из одного значения, отличного от NULL , к другому, предполагается, что указатель указывает на объект данных того же типа. Данные, возвращаемые с сервера, записываются в существующее хранилище, указанное значением уникального указателя перед вызовом.
  • Может быть потеряна память на клиенте. Память, на которую ссылается уникальный указатель, отличный от NULL , никогда не может быть освобождена, если уникальный указатель изменяется на NULL во время вызова, и клиент не имеет другого способа разыменовки хранилища.
  • Не вызывает псевдонимов. Как и в случае с хранилищем, на который указывает указатель ссылки, хранилище, указываемое уникальным указателем, не может быть достигнуто из любого другого имени в функции.

Заглушки вызывают пользовательские функции управления памятью midl_user_allocate и midl_user_free для выделения и освобождения памяти, необходимой для уникальных указателей и их ссылок.

К уникальным указателям применяются следующие ограничения:

  • Атрибут [unique] нельзя применить к параметрам binding-handle ( handle_t) и параметрам контекстного дескриптора.
  • Атрибут [unique] не может применяться к параметрам указателя верхнего уровня только для [out](параметры, имеющие только атрибут направления [out]).
  • По умолчанию указатели верхнего уровня в списках параметров являются указателями [ref] . Это верно, даже если интерфейс указывает pointer_default(unique). Параметры верхнего уровня в списках параметров должны быть указаны с атрибутом [unique] , чтобы быть уникальным указателем.
  • Уникальные указатели нельзя использовать для описания размера массива или руки объединения, так как уникальные указатели могут иметь значение NULL. Это ограничение предотвращает ошибку, которая приводит к тому, что значение NULL используется в качестве размера массива или размера объединения.

Примеры

pointer_default(unique) 
 
typedef [unique, string] unsigned char * MY_STRING_TYPE; 
 
[unique] char * MyFunction([in, out, unique] long * plNumber);

См. также

Массивы

Массивы и указатели

Атрибуты массива и Sized-Pointer

Базовые типы MIDL

обратный вызов

const

context_handle

Перечисления

first_is

Обрабатывать

handle_t

Игнорировать

last_is

length_is

Местных

max_is

midl_user_allocate

midl_user_free

out

pointer_default

ptr

Ref

size_is

строка

Структура

switch_type

transmit_as

Союза