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]. Разделяйте несколько атрибутов запятыми.
-
type-specifier
-
Указывает базовый тип, структуру, объединение, тип перечисления или идентификатор типа. Необязательная спецификация хранилища может предшествовать описательу типа.
-
Стандартный декларатор
-
Указывает стандартный декларатор C, например идентификатор, декларатор указателя или декларатор массива. Дополнительные сведения см. в разделе Атрибуты массива и Sized-Pointer, массивы и массивы и указатели.
-
Declarator-list
-
Задает стандартные деклараторы C, такие как идентификаторы, деклараторы указателей и деклараторы массива. Дополнительные сведения см. в разделе Атрибуты массива и Sized-Pointer, массивы и массивы и указатели. Список деклараторов состоит из одного или нескольких деклараторов, разделенных запятыми. Идентификатор parameter-name в деклараторе функции является необязательным.
-
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
-
Указывает по крайней мере один декларатор указателя, к которому применяется атрибут [ptr] . Декларатор указателя совпадает с декларатором указателя, используемым в C; он создается из конструктора *, модификаторов, таких как far, и const квалификатора.
-
function-name
-
Указывает имя удаленной процедуры.
-
parameter-attribute-list
-
Состоит из нуля или нескольких атрибутов, соответствующих указанному типу параметра. Атрибуты параметров могут принимать атрибуты направления в ииз него; атрибуты полей first_is, last_is, length_is, max_is, size_is и switch_type; ссылка на атрибут указателя, уникальный или [ptr]; и атрибуты использования context_handle и string. Атрибут использования ignore нельзя использовать в качестве атрибута параметра. Разделяйте несколько атрибутов запятыми.
Комментарии
Полный указатель, обозначенный атрибутом [ptr] , приближается к полной функциональности указателя языка C. Полный указатель может иметь значение NULL и может изменяться во время вызова с NULL на значение, отличное от 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);
См. также раздел