Partager via


Espaces de noms GDL

L’analyseur GDL n’autorise pas la définition d’un modèle portant le même nom plusieurs fois. Deux fichiers de modèle écrits indépendamment peuvent utiliser par inadvertance le même nom pour un modèle et vous empêcher d’inclure ces deux fichiers de modèle dans votre fichier GDL.

Pour éviter les problèmes de collision de noms, GDL prend en charge les espaces de noms. L’auteur d’un fichier d’en-tête peut spécifier à quel espace de noms chaque modèle et définition de macro doit appartenir en plaçant la définition entière dans une construction *DefineInNameSpace. Le symbole fourni comme nom de instance de cette construction deviendra l’espace de noms auquel appartiendront toutes les définitions incluses. Si une définition réside dans deux ou plusieurs constructions *DefineInNameSpace imbriquées, elle appartient uniquement à l’espace de noms défini par la construction *DefineInNameSpace la plus interne. Si une définition ne réside dans aucune construction *DefineInNameSpace, elle est affectée à l’espace de noms par défaut ou « sans nom ».

Si les entrées qui composent le corps d’un modèle ou d’une construction de macro sont placées dans des constructions *DefineInNameSpace distinctes, l’analyseur ne place pas ces entrées individuelles dans le nouvel espace de noms, car les entrées individuelles ne sont pas une définition distincte, elles ne peuvent donc pas résider dans un espace de noms différent. Les macros de bloc autorisent les définitions de macros imbriquées, et ces définitions imbriquées peuvent être affectées à d’autres espaces de noms. Toutefois, la modification de l’espace de noms d’une définition imbriquée ne prolonge pas sa durée de vie. Une définition de macro imbriquée ne peut être référencée que dans le niveau d’imbrication dans lequel elle a été définie.

Un nom de modèle ou de macro peut être référencé dans un formulaire qualifié ou non qualifié dans un espace de noms. Pour qualifier un modèle ou un nom de macro, le nom de l’espace de noms est simplement préfixé au nom du modèle ou de la macro avec un caractère deux-points intermédiaire (par exemple, Namespace:MacroName).

Note Le nom de symbole fourni comme valeur de *Template, *Macros ou *BlockMacro definitions ne peut pas être qualifié par un espace de noms. L’espace de noms d’une définition peut être défini uniquement à l’aide de *DefineInNameSpace.

Par exemple, une fois qu’un modèle nommé « TEMPNAME » a été défini dans un espace de noms nommé « NSName », ce modèle peut être référencé par une autre définition de modèle à l’aide du formulaire qualifié d’espace de noms, comme le montre l’exemple de code suivant.

*DefineInNameSpace: NSName
{
    *Template:  TEMPNAME
    {
        *%  member attributes
    }
}

Ce modèle peut désormais être référencé à partir d’un autre modèle à l’aide de la syntaxe qualifiée d’espace de noms, comme le montre l’exemple de code suivant.

*Template:  ANOTHER_TEMPLATE
{
    *Inherits: NSName:TEMPNAME
}

Si la majorité des références de modèle font référence au même espace de noms ou s’il n’existe aucune collision de noms entre les noms de modèles référencés dans plusieurs espaces de noms, vous pouvez omettre le qualificateur d’espace de noms et fournir uniquement le nom du modèle et vous appuyer sur l’analyseur pour rechercher une liste d’espaces de noms jusqu’à ce qu’un modèle correspondant soit trouvé.

La liste des espaces de noms est spécifiée en englobant une ou plusieurs entrées GDL dans les constructions *UsingNameSpace. Si l’une de ces entrées contient des références non qualifiées à un modèle ou à une macro, la résolution de ces références est affectée par les constructions *UsingNameSpace. Le symbole fourni comme nom de instance de cette construction identifie l’espace de noms à rechercher.

Vous pouvez spécifier plusieurs espaces de noms en imbriquant plusieurs constructions. L’ordre de recherche commence par la construction *UsingNameSpace la plus interne et se poursuit vers l’extérieur. Si une définition de modèle est trouvée dans un espace de noms spécifié, la recherche s’arrête et ce modèle est utilisé. Si aucune correspondance n’a été trouvée après la recherche de tous les espaces de noms explicitement spécifiés, l’analyseur effectue une recherche dans l’espace de noms nommé dans chaque construction *DefineInNameSpace englobante à partir de la construction la plus interne vers l’extérieur. Et si cette recherche ne parvient pas à résoudre la référence, elle tente d’effectuer une recherche dans l’espace de noms « sans nom ».

Note Si vous devez isoler l’ordre de recherche de l’espace de noms des influences extérieures, tous les espaces de noms nécessaires pour résoudre les références doivent être spécifiés à l’aide des constructions *UsingNameSpace.

Vous ne devez pas vous appuyer sur la construction *DefineInNameSpace pour établir l’ordre de recherche, car l’hôte peut entourer le fichier inclus de constructions *UsingNameSpace supplémentaires et les espaces de noms spécifiés par l’hôte seront recherchés avant les espaces de noms nommés par les constructions *DefineInNameSpace.

Par exemple, le modèle qui a été défini précédemment a montré deux espaces de noms qui ont été explicitement spécifiés pour être utilisés pour la résolution de noms de modèle. Tout espace de noms nommé par *UsingNameSpace doit avoir été précédemment défini par *DefineInNameSpace. L’exception est l’espace de noms « sans nom », qui existe toujours et est nommé par le symbole NULL.

L’exemple de code suivant montre comment spécifier l’espace de noms « sans nom » pour définir l’ordre de recherche.

*UsingNameSpace: NSName2
{
    *UsingNameSpace:  *%%%%%  omitting symbol specifies the  Unnamed 
*%  Namespace.
    {
        *UsingNameSpace: NSName
        {
            *Template:  ANOTHER_TEMPLATE
            {
                *Inherits: TEMPNAME
            }
        }
    }
}

Dans l’exemple précédent, l’espace de noms « sans nom » fait l’objet d’une recherche après l’échec de toutes les recherches dans l’espace de noms explicitement spécifié, mais l’exemple spécifie explicitement que l’espace de noms « sans nom » doit être recherché avant l’espace de noms NSName2.

Étant donné que les entrées de données GDL ne référencent jamais explicitement les noms de modèle, l’utilisation de *UsingNameSpace n’affecte pas le modèle affecté à chaque entrée de données. Toutefois, l’ordre de recherche de l’espace de noms spécifié par *UsingNameSpace (qui est en vigueur au moment où la première entrée de données GDL est analysée) est utilisé dans la recherche du modèle ROOT. Si vous incluez un ou plusieurs fichiers d’en-tête GDL, vous devez vous assurer qu’ils ne deviennent pas les premiers par inadvertance à définir une entrée de données et, par conséquent, à déterminer l’espace de noms utilisé pour rechercher le modèle ROOT.

Note Les définitions de macro sont limitées par le niveau d’imbrication englobant. Toutefois, les niveaux d’imbrication d’espaces de noms ne limitent pas l’étendue des définitions de macro, car vous n’avez pas besoin de définir une macro pour appartenir à un espace de noms particulier si l’étendue de la macro n’est pas suffisamment grande pour être visible en dehors de cet espace de noms.

Les constructions d’espace de noms peuvent être entrelacées entre d’autres types de constructions. Il n’existe presque aucune restriction sur l’emplacement où une construction d’espace de noms peut apparaître. Les constructions sans espace de noms n’affectent pas la résolution de l’espace de noms.