ptr - атрибут
Атрибут [ptr] обозначает указатель как полный указатель.
pointer_default(ptr)
typedef [ ptr [ , type-attribute-list ] ] type-specifier declarator-list;
typedef [ struct | union ]
{
[ ptr [ , field-attribute-list ] ] type-specifier declarator-list;
...
}
[ ptr [ , function-attribute-list ] ] type-specifier ptr-decl function-name(
[ [ parameter-attribute-list ] ] type-specifier [standard-declarator]
, ...);
[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
[ ptr [[ , parameter-attribute-list ]] ] type-specifier [[standard-declarator]]
, ...);
Параметры
-
type-attribute-list
-
Указывает один или несколько атрибутов, применяемых к типу. Допустимые атрибуты типа: [handle], [switch_type], [transmit_as]; атрибут указателя [ref], [unique, или [ptr]; и атрибуты использования [context_handle], [string]и [ignore]. Разделите несколько атрибутов запятыми.
-
описатель типа
-
Задает базовый тип, структуру, объединение или идентификатор перечисления или идентификатор типа. Необязательная спецификация хранилища может предшествовать описательу типа.
-
Стандартный декларатор
-
Задает стандартный декларатор C, например идентификатор, декларатор указателя или декларатор массива. Дополнительные сведения см. в разделе "Массив" и Sized-Pointer "Атрибуты", "Массивы" и " Массивы" и "Указатели".
-
declarator-list
-
Задает стандартные деклараторы C, такие как идентификаторы, деклараторы указателей и деклараторы массива. Дополнительные сведения см. в разделе "Массив" и Sized-Pointer "Атрибуты", "Массивы" и " Массивы" и "Указатели". Список деклараторов состоит из одного или нескольких деклараторов, разделенных запятыми. Идентификатор имени параметра в деклараторе функции является необязательным.
-
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
-
Указывает по крайней мере один декларатор указателя, к которому применяется атрибут [ptr ]. Декларатор указателя совпадает с декларатором указателя, используемым в C; он создается на основе конструктора *, модификаторов, таких как даль, и константы квалификатора.
-
имя функции
-
Указывает имя удаленной процедуры.
-
parameter-attribute-list
-
Состоит из нуля или нескольких атрибутов, соответствующих указанному типу параметра. Атрибуты параметров могут принимать направленные иисходящие атрибуты; атрибуты поля first_is, last_is, length_is, max_is, size_is и switch_type; ссылка на атрибут указателя, уникальный или [ptr]; и атрибуты использования context_handle и строки. Атрибут использования не может использоваться в качестве атрибута параметра. Разделите несколько атрибутов запятыми.
Remarks
Полный указатель, назначенный атрибутом [ptr] , приближается к полной функциональности указателя языка C. Полный указатель может иметь значение NULL и может измениться во время вызова с NULL на non-NULL. служба хранилища, на которые указывают полные указатели, можно получить по другим именам в приложении, поддерживающим псевдонимы и циклы. Эта функция требует больше накладных расходов во время удаленного вызова процедуры, чтобы определить данные, на которые ссылается указатель, определить, равно ли значение NULL, и обнаружить, указывают ли два указателя на одни и те же данные.
Используйте полные указатели для:
- Удаленные возвращаемые значения.
- Двойные указатели, если размер выходного параметра неизвестен.
- Указатели NULL .
Полные (и уникальные) указатели нельзя использовать для описания размера массива или объединения, так как эти указатели могут иметь значение NULL. Это ограничение MIDL предотвращает ошибку, которая может привести к тому, что значение NULL используется в качестве размера.
Предполагается, что ссылочные и уникальные указатели не вызывают псевдонимов данных. Направленный граф, полученный с уникального указателя или ссылочного указателя, и следующие только уникальные или ссылочные указатели не содержат ни разведения, ни циклов.
Чтобы избежать псевдонимов, все значения указателя должны быть получены из входного указателя одного класса указателя. Если несколько указателей указывают на одно расположение памяти, все такие указатели должны быть полными указателями.
В некоторых случаях можно смешивать полные и уникальные указатели. При условии, что назначение не нарушает ограничения на изменение значения уникального указателя, можно назначить полный указатель. Однако при назначении уникального указателя значение полного указателя может привести к псевдониму.
Сочетание полных и уникальных указателей может привести к псевдонимам, как показано в следующем примере:
typedef struct
{
[ptr] short * pdata; // full pointer
} GRAPH_NODE_TYPE;
typedef struct
{
[unique] graph_node * left; // unique pointer
[unique] graph_node * right; // unique pointer
} TREE_NODE_TYPE;
// application code:
short a = 5;
TREE_NODE_TYPE * t;
GRAPH_NODE_TYPE g, h;
g.pdata = h.pdata = &a;
t->left = &g;
t->right = &h;
// t->left->pdata == t->right->pdata == &a
Хотя "t-left" и "t-right" указывают на уникальные расположения памяти, псевдонимы "t-left-pdata>>>" и "t-right-pdata>>".> По этой причине алгоритмы поддержки псевдонимов должны следовать всем указателям (включая уникальные и ссылочные указатели), которые в конечном итоге могут достичь полного указателя.
Примеры
pointer_default(ptr)
typedef [ptr, string] unsigned char * MY_STRING_TYPE;
[ptr] char * MyFunction([in, out, unique] long * plNumber);
См. также раздел