Compartilhar via


Três tipos de ponteiro

O MIDL dá suporte a três tipos de ponteiros para acomodar uma ampla gama de aplicativos. Os três níveis diferentes são chamados de ponteiros de referência, exclusivos e completos e são indicados pelos atributos [ref], [unique], e [ptr], respectivamente. As classes de ponteiro descritas por esses atributos são mutuamente exclusivas. Atributos de ponteiro podem ser aplicados a ponteiros em definições de tipo, tipos de retorno de função, parâmetros de função, membros de estruturas ou uniões ou elementos de matriz.

Ponteiros inseridos são ponteiros que são membros de estruturas ou uniões. Eles também podem ser elementos de matrizes. Na direção [in] , os ponteiros [ref] inseridos são considerados apontando para um armazenamento válido e não devem ser nulos. Essa situação é recursivamente aplicável a quaisquer ponteiros [ref] para os quais eles estão apontando. Na direção [in] , ponteiros inseridos [exclusivos] e completos (ponteiros com o atributo [ptr] ) podem ou não ser nulos.

Qualquer atributo de ponteiro colocado em um parâmetro na sintaxe de uma declaração de função afeta apenas o declarador de ponteiro mais à direita para esse parâmetro. Para afetar outros declaradores de ponteiro, tipos nomeados intermediários devem ser usados.

As funções que retornam um ponteiro podem ter um atributo de ponteiro como um atributo de função. Os atributos [unique] e [ptr] devem ser aplicados aos tipos de retorno de função. Declarações de membro que são ponteiros podem especificar um atributo de ponteiro como um atributo de campo. Um atributo de ponteiro também pode ser aplicado como um atributo de tipo em constructos typedef .

Quando nenhum atributo de ponteiro é especificado como um atributo de campo ou tipo, os atributos de ponteiro são aplicados de acordo com as regras para uma declaração de ponteiro não atribuída da seguinte maneira.

No modo de compatibilidade de DCE, os atributos de ponteiro são determinados no arquivo IDL definidor. Se houver um atributo [pointer_default**]**especificado na interface de definição, esse atributo será usado. Se nenhum atributo [pointer_default] estiver presente, todos os ponteiros não atribuídos serão ponteiros completos.

No modo de extensões da Microsoft, os atributos de ponteiro podem ser determinados importando arquivos IDL e são aplicados na seguinte ordem:

  1. Um atributo de ponteiro explícito aplicado no site de uso.
  2. O atributo [ref] , quando o ponteiro não atribuído é um parâmetro de ponteiro de nível superior.
  3. Um atributo [pointer_default] especificado na interface de definição.
  4. Um atributo [pointer_default] especificado na interface base.
  5. O atributo [exclusivo] .

O atributo de interface [pointer_default] especifica os atributos de ponteiro padrão a serem aplicados a um declarador de ponteiro em um tipo, parâmetro ou declaração de tipo de retorno quando essa declaração não tiver um atributo de ponteiro explícito aplicado a ele. O atributo de interface [pointer_default] não se aplica a um ponteiro de nível superior não atribuído de um parâmetro, que é considerado [ref].