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], [строка] и [игнорировать]. Разделяйте несколько атрибутов запятыми.
-
type-specifier
-
Указывает базовый тип, структуру, объединение, тип перечисления или идентификатор типа. Необязательная спецификация хранилища может предшествовать описательу типа.
-
декларатор и список деклараторов
-
Задает стандартные деклараторы C, такие как идентификаторы, деклараторы указателей и деклараторы массива. Дополнительные сведения см. в разделах Атрибуты массива и Sized-Pointer, массивы и массивы и указатели. Список деклараторов состоит из одного или нескольких деклараторов, разделенных запятыми. Идентификатор parameter-name в деклараторе функции является необязательным.
-
декларатор struct-or-union-declarator
-
Указывает структуру MIDL или декларатор объединения .
-
field-attribute-list
-
Указывает ноль или несколько атрибутов поля, которые применяются к элементу структуры, члену объединения или параметру функции. Допустимые атрибуты полей: [first_is], [last_is], [length_is], [max_is], [size_is]; атрибуты использования [string], [ignore] и [context_handle]; атрибут указателя [ref], [unique], или [ptr]; и атрибут union [switch_type]. Разделяйте несколько атрибутов полей запятыми.
-
function-attribute-list
-
Указывает ноль или несколько атрибутов, применяемых к функции. Допустимые атрибуты функции: [callback], [local]; атрибут указателя [ref], [unique], или [ptr]; и атрибуты использования [string], [ignore] и [context_handle].
-
ptr-decl
-
Указывает по крайней мере один декларатор указателя, к которому применяется атрибут [unique] . Декларатор указателя совпадает с декларатором указателя, используемым в C; он создается из конструктора *, модификаторов, таких как far, и const квалификатора.
-
function-name
-
Указывает имя удаленной процедуры.
-
parameter-attribute-list
-
Состоит из нуля или нескольких атрибутов, соответствующих указанному типу параметра. Атрибуты параметра могут принимать атрибуты направления [in] и [out]; атрибуты поля [first_is], [last_is], [length_is], [max_is], [size_is] и [switch_type]; атрибут указателя [ref], unique или ptr; и атрибуты использования [context_handle] и [строка]. Атрибут использования [ignore] нельзя использовать в качестве атрибута параметра. Разделяйте несколько атрибутов запятыми.
Атрибуты указателя можно применять как атрибут типа; как атрибут поля, который применяется к элементу структуры, члену объединения или параметру; или как атрибут функции, который применяется к типу возвращаемого значения функции. Атрибут указателя также может отображаться с ключевое слово [pointer_default].
Уникальный указатель имеет следующие характеристики:
- Может иметь значение NULL.
- Может изменяться во время вызова с NULL на non-NULL, с non-NULL на NULL или с одного значения, отличного от NULL , к другому.
- Может выделять новую память на клиенте. При изменении уникального указателя с NULL на значение, отличное от NULL, данные, возвращаемые с сервера, записываются в новое хранилище.
- Может использовать существующую память на клиенте без выделения новой памяти. При изменении уникального указателя во время вызова из одного значения, отличного от NULL , к другому, предполагается, что указатель указывает на объект данных того же типа. Данные, возвращаемые сервером, записываются в существующее хранилище, заданное значением уникального указателя перед вызовом .
- Может ли потерянная память на клиенте. Память, на которую ссылается уникальный указатель, отличный от NULL , никогда не может быть освобождена, если уникальный указатель изменяется на NULL во время вызова и у клиента нет других средств разыменовки хранилища.
- Не вызывает псевдонимов. Как и хранилище, на которое указывает указатель ссылки, хранилище, на которое указывает уникальный указатель, не может быть достигнуто из любого другого имени в функции.
Заглушки вызывают предоставленные пользователем функции управления памятью midl_user_allocate и midl_user_free выделять и отменять выделение памяти, необходимой для уникальных указателей и их ссылок.
К уникальным указателям применяются следующие ограничения:
- Атрибут [unique] не может применяться к параметрам обработки привязки ( handle_t) и параметрам дескриптора контекста.
- Атрибут [unique] не может применяться к параметрам указателя верхнего уровня [out]( параметры, имеющие только атрибут направления [out] ).
- По умолчанию указатели верхнего уровня в списках параметров являются указателями [ссылка] . Это верно, даже если интерфейс указывает pointer_default(уникальный). Параметры верхнего уровня в списках параметров должны быть указаны с помощью атрибута [unique] , чтобы быть уникальным указателем.
- Уникальные указатели нельзя использовать для описания размера массива или руки объединения, так как уникальные указатели могут иметь значение NULL. Это ограничение предотвращает ошибку, возникающую при использовании значения NULL в качестве размера массива или размера union-arm.
pointer_default(unique)
typedef [unique, string] unsigned char * MY_STRING_TYPE;
[unique] char * MyFunction([in, out, unique] long * plNumber);