Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Атрибут [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);
См. также раздел