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


Три типа указателей

MIDL поддерживает три типа указателей для широкого спектра приложений. Три разных уровня называются ссылочными, уникальными и полными указателями и указываются атрибутами [ref], [unique], и [ptr], соответственно. Классы указателей, описанные этими атрибутами, являются взаимоисключающими. Атрибуты указателя могут применяться к указателям в определениях типов, возвращаемых типами функций, параметрами функции, элементами структур или объединений или элементами массива.

Внедренные указатели — это указатели, которые являются членами структур или объединений. Они также могут быть элементами массивов. Предполагается, что в направлении [в] внедренные указатели [ref] указывают на допустимое хранилище и не должны иметь значение NULL. Эта ситуация рекурсивно применима ко всем указателям [ссылок] , на которые они указывают. В направлении [in] внедренные [уникальные] и полные указатели (указатели с атрибутом [ptr] ) могут иметь значение NULL.

Любой атрибут указателя, помещенный в параметр в синтаксисе объявления функции, влияет только на крайний правый декларатор указателя для этого параметра. Чтобы повлиять на другие деклараторы указателей, необходимо использовать промежуточные именованные типы.

Функции, возвращающие указатель, могут иметь атрибут указателя в качестве атрибута функции. Атрибуты [unique] и [ptr] должны применяться к возвращаемым функциям типам. Объявления элементов, которые являются указателями, могут указывать атрибут указателя в качестве атрибута поля. Атрибут указателя также может применяться в качестве атрибута типа в конструкциях typedef .

Если атрибут указателя не указан в качестве атрибута поля или типа, атрибуты указателя применяются в соответствии с правилами для объявления неатрибуированного указателя следующим образом.

В режиме совместимости DCE атрибуты указателя определяются в определяющем IDL-файле. Если в интерфейсе определения указан атрибут [pointer_default**]**, используется этот атрибут. Если атрибут [pointer_default] отсутствует, все ненаписанные указатели являются полными указателями.

В режиме microsoft-extensions атрибуты указателя можно определить путем импорта IDL-файлов и применять их в следующем порядке:

  1. Явный атрибут указателя, применяемый на сайте использования.
  2. Атрибут [ref] , когда ненаписанный указатель является параметром указателя верхнего уровня.
  3. Атрибут [pointer_default] , указанный в определяемом интерфейсе.
  4. Атрибут [pointer_default] , указанный в базовом интерфейсе.
  5. Атрибут [unique] .

Атрибут интерфейса [pointer_default] указывает атрибуты указателя по умолчанию, применяемые к декларатору указателя в объявлении типа, параметра или возвращаемого типа, если к объявлению не применен явный атрибут указателя. Атрибут интерфейса [pointer_default] не применяется к неназированному указателю верхнего уровня параметра, который считается [ref].