Udostępnij za pośrednictwem


Przestrzenie nazw GDL

Analizator GDL nie zezwoli na zdefiniowanie szablonu o tej samej nazwie więcej niż raz. Dwa niezależne pliki szablonów mogą przypadkowo używać tej samej nazwy szablonu i uniemożliwić dołączenie obu tych plików szablonu w pliku GDL.

Aby uniknąć problemów z kolizją nazw, język GDL obsługuje przestrzenie nazw. Autor pliku nagłówka może określić przestrzeń nazw, do której powinna należeć każda definicja szablonu i makra, poprzez objęcie całej definicji w konstrukcji *DefineInNameSpace. Symbol podany jako nazwa wystąpienia tej konstrukcji stanie się przestrzenią nazw, do którego będą należeć wszystkie ujęte definicje. Jeśli definicja znajduje się w co najmniej dwóch zagnieżdżonych konstrukcjach *DefineInNameSpace, będzie należeć tylko do przestrzeni nazw zdefiniowanej przez najbardziej wewnętrzną konstrukcję *DefineInNameSpace. Jeśli definicja nie znajduje się w żadnej konstrukcji *DefineInNameSpace, zostanie przypisana do domyślnej lub "nienazwanej" przestrzeni nazw.

Jeśli wpisy składające się na treść szablonu lub konstrukcji makra są ujęte w oddzielne konstrukcje *DefineInNameSpace, analizator nie umieści tych pojedynczych wpisów w nowej przestrzeni nazw, ponieważ poszczególne wpisy nie są oddzielną definicją, więc nie mogą żyć w innej przestrzeni nazw. Makra blokowe zezwalają na zagnieżdżone definicje makr, a te zagnieżdżone definicje można przypisać do innych przestrzeni nazw. Jednak zmiana przestrzeni nazw zagnieżdżonej definicji nie wydłuża okresu istnienia. Definicja makra zagnieżdżonego może być przywoływana tylko w ramach poziomu zagnieżdżenia, w którym została zdefiniowana.

Można się odwoływać do szablonu lub nazwy makra w postaci kwalifikowanej lub niekwalifikowanej w przestrzeni nazw. Aby zakwalifikować szablon lub nazwę makra, nazwę przestrzeni nazw po prostu poprzedza się dwukropkiem i łączy z nazwą szablonu lub makra (na przykład Namespace:MacroName).

Uwaga Nazwa symbolu podana jako wartość *Szablon, *Makra lub *Makra Blokowe nie może być kwalifikowana przez przestrzeń nazw. Przestrzeń nazw definicji można zdefiniować tylko przy użyciu *DefineInNameSpace.

Na przykład po zdefiniowaniu szablonu o nazwie "TEMPNAME" w przestrzeni nazw "NSName", można odwoływać się do tego szablonu przy użyciu kwalifikowanej formy przestrzeni nazw, jak pokazano w poniższym przykładzie kodu.

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

Ten szablon można teraz przywoływać z innego szablonu przy użyciu kwalifikowanej składni przestrzeni nazw, jak pokazano w poniższym przykładzie kodu.

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

Jeśli większość odwołań do szablonu będzie odwoływać się do tej samej przestrzeni nazw lub jeśli nie ma kolizji nazw między nazwami szablonów, do których odwołuje się co najmniej dwie przestrzenie nazw, można pominąć kwalifikator przestrzeni nazw i podać tylko nazwę szablonu i opierać się na analizatorze, aby wyszukać listę przestrzeni nazw do momentu znalezienia pasującego szablonu.

Lista przestrzeni nazw jest określana przez dołączenie co najmniej jednego wpisu GDL w konstrukcji *UsingNameSpace. Jeśli którykolwiek z tych wpisów zawiera niekwalifikowane odwołania do szablonu lub makra, rozwiązanie tych odwołań będzie miało wpływ na konstrukcje *UsingNameSpace. Symbol podany jako nazwa wystąpienia tej konstrukcji identyfikuje przestrzeń nazw do wyszukania.

Można określić wiele przestrzeni nazw, zagnieżdżając kilka elementów konstrukcyjnych. Kolejność wyszukiwania rozpoczyna się od najbardziej wewnętrznej konstrukcji *UsingNameSpace i przechodzi na zewnątrz. Jeśli definicja szablonu zostanie znaleziona w określonej przestrzeni nazw, wyszukiwanie zostanie zatrzymane i zostanie użyty ten szablon. Jeśli nie znaleziono dopasowania po przeszukaniu wszystkich jawnie określonych przestrzeni nazw, analizator przeszuka przestrzeń nazw wskazaną w każdej otaczającej konstrukcji *DefineInNameSpace, zaczynając od najbardziej wewnętrznej konstrukcji ku zewnętrznym. Jeśli to wyszukiwanie nie rozwiąże problemu z odwołaniem, spróbuje wyszukać przestrzeń nazw "nienazwanych".

Uwaga Jeśli musisz odizolować kolejność wyszukiwania przestrzeni nazw od zewnętrznych wpływów, wszystkie przestrzenie nazw potrzebne do rozpoznawania odwołań powinny być określone przy użyciu konstrukcji *UsingNamespace.

Nie należy polegać na konstrukcji *DefineInNameSpace w celu ustanowienia kolejności wyszukiwania, ponieważ host może otaczać dołączony plik dodatkowymi konstrukcjami *UsingNameSpace, a przestrzenie nazw określone przez hosta zostaną przeszukane przed przestrzeniami nazw, które są nazwane przez konstrukcje *DefineInNameSpace.

Na przykład zdefiniowany wcześniej szablon pokazał dwie przestrzenie nazw, które zostały jawnie określone do użycia na potrzeby rozpoznawania nazw szablonów. Dowolna przestrzeń nazw o nazwie *UsingNameSpace musi być wcześniej zdefiniowana przez *DefineInNameSpace. Wyjątkiem jest przestrzeń nazw "nienazwana", która zawsze istnieje i jest nazwana przez symbol NULL.

W poniższym przykładzie kodu pokazano, jak określić przestrzeń nazw "nienazwanych", aby zdefiniować kolejność wyszukiwania.

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

W poprzednim przykładzie przestrzeń nazw "nienazwana" zostanie przeszukana po tym, jak wszystkie wyszukiwania w jawnie określonej przestrzeni nazw nie powiodły się, ale w przykładzie jawnie określono, że przestrzeń nazw "nienazwana" zostanie przeszukana przed przestrzenią nazw NSName2.

Ponieważ wpisy danych GDL nigdy jawnie nie odwołują się do nazw szablonów, użycie *UsingNameSpace nie wpłynie na to, który szablon jest przypisany do każdego wpisu danych. Jednak kolejność wyszukiwania przestrzeni nazw, którą określa *UsingNameSpace (obowiązująca w momencie analizowania pierwszego wpisu danych GDL), jest używana do wyszukiwania szablonu ROOT. Jeśli dołączasz co najmniej jeden plik nagłówka GDL, upewnij się, że nie przypadkowo staną się one pierwszym, aby zdefiniować wpis danych, a tym samym określić, która przestrzeń nazw jest używana do znalezienia szablonu ROOT.

Uwaga Definicje makr są ograniczone zakresem do poziomu zagnieżdżania, który je otacza. Jednak poziomy zagnieżdżania przestrzeni nazw nie ograniczają zakresu definicji makr, ponieważ nie trzeba definiować makra, aby należeć do określonej przestrzeni nazw, jeśli zakres makra nie jest wystarczająco duży, aby być widocznym poza tą przestrzenią nazw.

Elementy przestrzeni nazw można przeplatać z innymi typami elementów. Prawie nie ma żadnych ograniczeń dotyczących tego, gdzie może pojawić się konstrukcja przestrzeni nazw. Konstrukcje spoza przestrzeni nazw nie mają wpływu na rozpoznawanie przestrzeni nazw.