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

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

Массивы

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

Атрибуты массива и Sized-Pointer

Базовые типы MIDL

обратный вызов

const

context_handle

Перечисления

first_is

Обрабатывать

Файл определения интерфейса (IDL)

Игнорировать

last_is

length_is

Местных

max_is

pointer_default

Ref

size_is

строка

Структура

switch_type

transmit_as

Союза

Уникальный