Trois types de pointeurs
MIDL prend en charge trois types de pointeurs pour prendre en charge un large éventail d’applications. Les trois niveaux différents sont appelés pointeurs de référence, uniques et complets, et sont indiqués par les attributs [ref], [unique] et [ptr], respectivement. Les classes de pointeur décrites par ces attributs s’excluent mutuellement. Les attributs de pointeur peuvent être appliqués à des pointeurs dans des définitions de type, des types de retour de fonction, des paramètres de fonction, des membres de structures ou d’unions ou des éléments de tableau.
Les pointeurs incorporés sont des pointeurs qui sont membres de structures ou d’unions. Il peut également s’agir d’éléments de tableaux. Dans le sens [in], les pointeurs [ref] incorporés sont supposés pointer vers un stockage valide et ne doivent pas être null. Cette situation est récursivement applicable à tous les pointeurs [ref] vers lesquels ils pointent. Dans le sens [in], les pointeurs incorporés [unique] et complets (pointeurs avec l’attribut [ptr] ) peuvent être null ou non.
Tout attribut de pointeur placé sur un paramètre dans la syntaxe d’une déclaration de fonction affecte uniquement le déclarateur de pointeur le plus à droite pour ce paramètre. Pour affecter d’autres déclarateurs de pointeur, des types nommés intermédiaires doivent être utilisés.
Les fonctions qui retournent un pointeur peuvent avoir un attribut pointeur en tant qu’attribut de fonction. Les attributs [unique] et [ptr] doivent être appliqués aux types de retour de fonction. Les déclarations membres qui sont des pointeurs peuvent spécifier un attribut de pointeur en tant qu’attribut de champ. Un attribut pointeur peut également être appliqué en tant qu’attribut de type dans les constructions typedef .
Lorsqu’aucun attribut de pointeur n’est spécifié en tant qu’attribut de champ ou d’attribut de type, les attributs de pointeur sont appliqués conformément aux règles d’une déclaration de pointeur non attribuée comme suit.
En mode de compatibilité DCE, les attributs de pointeur sont déterminés dans le fichier IDL de définition. S’il existe un attribut [pointer_default*** spécifié dans l’interface de définition, cet attribut est utilisé. Si aucun attribut [pointer_default] n’est présent, tous les pointeurs non attribués sont des pointeurs complets.
En mode Microsoft-extensions, les attributs de pointeur peuvent être déterminés en important des fichiers IDL et sont appliqués dans l’ordre suivant :
- Attribut de pointeur explicite appliqué au site d’utilisation.
- Attribut [ref], lorsque le pointeur non attribué est un paramètre de pointeur de niveau supérieur.
- Attribut [pointer_default] spécifié dans l’interface de définition.
- Attribut [pointer_default] spécifié dans l’interface de base.
- Attribut [unique].
L’attribut d’interface [pointer_default] spécifie les attributs de pointeur par défaut à appliquer à un déclarateur de pointeur dans une déclaration de type, de paramètre ou de type de retour lorsque cette déclaration ne comporte pas d’attribut de pointeur explicite. L’attribut d’interface [pointer_default] ne s’applique pas à un pointeur de niveau supérieur non attribué d’un paramètre, qui est supposé être [ref].