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

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


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);

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

Массивы

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

Атрибуты массива и 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

union