Пространства имен GDL
Средство синтаксического анализа GDL не позволит определить шаблон с одинаковым именем более одного раза. Два файла шаблонов, написанные независимо друг от друга, могут непреднамеренно использовать одно и то же имя для шаблона и не включать оба этих файла в GDL-файл.
Чтобы избежать проблем с конфликтом имен, GDL поддерживает пространства имен. Автор файла заголовка может указать, к какому пространству имен должен принадлежать каждый шаблон и определение макроса, заключив все определение в конструкцию *DefineInNameSpace. Символ, указанный в качестве имени экземпляра этой конструкции, станет пространством имен, к которому будут принадлежать все вложенные определения. Если определение находится в двух или более вложенных конструкциях *DefineInNameSpace, оно будет принадлежать только пространству имен, определенному самой внутренней конструкцией *DefineInNameSpace. Если определение не находится в конструкциях *DefineInNameSpace, оно будет назначено пространству имен по умолчанию или "неименованно".
Если записи, составляющие тело конструкции шаблона или макроса, заключены в отдельные конструкции *DefineInNameSpace, средство синтаксического анализа не поместит эти отдельные записи в новое пространство имен, так как отдельные записи не являются отдельным определением, поэтому они не могут размещаться в другом пространстве имен. Блочные макросы разрешают вложенные определения макросов, и эти вложенные определения могут быть назначены другим пространствам имен. Однако изменение пространства имен вложенного определения не продлевает его время существования. На определение вложенного макроса можно ссылаться только на уровне вложенности, на который оно было определено.
На имя шаблона или макроса можно ссылаться в полном или неполном виде в пространстве имен. Чтобы определить имя шаблона или макроса, имя пространства имен просто добавляется к имени шаблона или макроса с символом двоеточия (например, Namespace:MacroName).
Примечание Имя символа, указанное в качестве значения определений *Template, *Macros или *BlockMacro, не может быть квалифицировано пространством имен. Пространство имен определения можно определить только с помощью *DefineInNameSpace.
Например, после определения шаблона с именем TEMPNAME в пространстве имен С именем NSName на этот шаблон можно ссылаться с помощью другого определения шаблона с помощью формы с указанием пространства имен, как показано в следующем примере кода.
*DefineInNameSpace: NSName
{
*Template: TEMPNAME
{
*% member attributes
}
}
Теперь на этот шаблон можно ссылаться из другого шаблона с помощью синтаксиса с указанием пространства имен, как показано в следующем примере кода.
*Template: ANOTHER_TEMPLATE
{
*Inherits: NSName:TEMPNAME
}
Если большинство ссылок на шаблон ссылается на одно и то же пространство имен или нет конфликта имен между именами шаблонов, на которые ссылается два или более пространства имен, можно опустить квалификатор пространства имен и указать только имя шаблона и использовать средство синтаксического анализа для поиска списка пространств имен до тех пор, пока не будет найден соответствующий шаблон.
Список пространств имен указывается путем заключения одной или нескольких записей GDL в конструкции *UsingNameSpace. Если какая-либо из этих записей содержит непроверенные ссылки на шаблон или макрос, на разрешение этих ссылок будут влиять конструкции *UsingNameSpace. Символ, который предоставляется в качестве имени экземпляра этой конструкции, определяет пространство имен для поиска.
Можно указать несколько пространств имен путем вложения нескольких конструкций. Порядок поиска начинается с самой внутренней конструкции *UsingNameSpace и переходит наружу. Если определение шаблона найдено в указанном пространстве имен, поиск останавливается, и этот шаблон используется. Если совпадение не найдено после поиска во всех явно указанных пространствах имен, средство синтаксического анализа выполнит поиск пространства имен, именованного в каждой включающей конструкции *DefineInNameSpace, из самой внутренней конструкции наружу. Если при поиске не удается разрешить ссылку, будет предпринята попытка выполнить поиск в пространстве имен "без имени".
Примечание Если необходимо изолировать порядок поиска пространства имен от внешних воздействий, все пространства имен, необходимые для разрешения ссылок, следует указать с помощью конструкций *UsingNameSpace.
Не следует полагаться на конструкцию *DefineInNameSpace для определения порядка поиска, так как узел может окружить включенный файл дополнительными конструкциями *UsingNameSpace, а указанные узлом пространства имен будут выполняться до пространств имен, именуемых конструкциями *DefineInNameSpace.
Например, шаблон, который был определен ранее, показал два пространства имен, которые были явно указаны для использования для разрешения имен шаблонов. Любое пространство имен, именованное параметром *UsingNameSpace, должно быть ранее определено в *DefineInNameSpace. Исключением является пространство имен unnamed, которое всегда существует и называется символом NULL.
В следующем примере кода показано, как указать пространство имен unnamed для определения порядка поиска.
*UsingNameSpace: NSName2
{
*UsingNameSpace: *%%%%% omitting symbol specifies the Unnamed
*% Namespace.
{
*UsingNameSpace: NSName
{
*Template: ANOTHER_TEMPLATE
{
*Inherits: TEMPNAME
}
}
}
}
В предыдущем примере поиск в пространстве имен unnamed будет выполняться после того, как все поиски в явно указанном пространстве имен завершились ошибкой, но в примере явно указывается, что поиск в пространстве имен "неименован" выполняется перед пространством имен NSName2.
Поскольку записи данных GDL никогда не ссылаются на имена шаблонов явным образом, использование *UsingNameSpace не повлияет на то, какой шаблон назначается каждой записи данных. Однако порядок поиска пространства имен, который указывает *UsingNameSpace (который действует на момент анализа первой записи данных GDL), используется при поиске шаблона ROOT. Если вы включаете один или несколько файлов заголовков GDL, следует убедиться, что они не станут первыми, чтобы определить ввод данных и, следовательно, определить, какое пространство имен используется для поиска шаблона ROOT.
Примечание Определения макросов область ограничены уровнем вложенности. Однако уровни вложенности пространств имен не ограничивают область определений макросов, так как не нужно определять макрос, принадлежащий определенному пространству имен, если область макроса недостаточно велик, чтобы быть видимым за пределами этого пространства имен.
Конструкции пространства имен могут чередуться между другими типами конструкций. Практически нет ограничений на то, где может появиться конструкция пространства имен. Конструкции, не относящиеся к пространству имен, не влияют на разрешение пространства имен.