다음을 통해 공유


GDL 네임스페이스

GDL 파서는 이름이 같은 템플릿을 두 번 이상 정의할 수 없습니다. 독립적으로 작성된 두 개의 템플릿 파일은 실수로 템플릿에 동일한 이름을 사용하고 GDL 파일에 이러한 템플릿 파일을 모두 포함하지 못하게 할 수 있습니다.

이름 충돌 문제를 방지하기 위해 GDL은 네임스페이스를 지원합니다. 헤더 파일의 작성자가 *DefineInNameSpace 구문 내에서 전체 정의를 묶어 각 템플릿 및 매크로 정의가 속해야 하는 네임스페이스를 지정할 수 있습니다. 이 구문의 인스턴스 이름으로 제공되는 기호는 모든 묶인 정의가 속하게 될 네임스페이스가 됩니다. 정의가 둘 이상의 중첩 *DefineInNameSpace 구문 내에 있는 경우 가장 안쪽 *DefineInNameSpace 구문으로 정의된 네임스페이스에만 속합니다. 정의가 *DefineInNameSpace 구문 내에 있지 않으면 기본 또는 "명명되지 않은" 네임스페이스에 할당됩니다.

템플릿이나 매크로 구문을 구성하는 항목이 별도의 *DefineInNameSpace 구문 안에 포함될 경우, 해당 항목들은 개별 정의가 아니기 때문에 파서가 새로운 네임스페이스에 배치하지 않습니다. 따라서 다른 네임스페이스에 포함될 수 없습니다. 블록 매크로는 중첩된 매크로 정의를 허용하며 이러한 중첩된 정의를 다른 네임스페이스에 할당할 수 있습니다. 그러나 중첩된 정의의 네임스페이스를 변경해도 수명은 연장되지 않습니다. 중첩된 매크로 정의는 정의된 중첩 수준 내에서만 참조할 수 있습니다.

네임스페이스에서 정규화되거나 정규화되지 않은 형식으로 템플릿 또는 매크로 이름을 참조할 수 있습니다. 템플릿 또는 매크로 이름을 한정하기 위해 네임스페이스 이름은 중간 콜론 문자(예: 네임스페이스:MacroName)가 있는 템플릿 또는 매크로 이름 앞에 접두사로 추가됩니다.

메모 *Template, *Macros 또는 *BlockMacro 정의의 값으로 제공되는 기호 이름은 네임스페이스로 정규화할 수 없습니다. 정의의 네임스페이스는 *DefineInNameSpace를 사용해야만 정의할 수 있습니다.

예를 들어 "TEMPNAME"이라는 이름의 템플릿이 "NSName"이라는 네임스페이스 내에서 정의되면 다음 코드 예제와 같이 네임스페이스 정규화된 양식을 사용하여 다른 템플릿 정의에서 해당 템플릿을 참조할 수 있습니다.

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

이제 다음 코드 예제와 같이 네임스페이스 정규화된 구문을 사용하여 다른 템플릿에서 이 템플릿을 참조할 수 있습니다.

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

대부분의 템플릿 참조가 동일한 네임스페이스를 참조하거나 둘 이상의 네임스페이스 내에서 참조되는 템플릿 이름 간에 이름 충돌이 없는 경우 네임스페이스 한정자를 생략하고 템플릿 이름만 제공하고 일치하는 템플릿을 찾을 때까지 파서에 의존하여 네임스페이스 목록을 검색할 수 있습니다.

네임스페이스 목록은 *UsingNameSpace 구문 내에 하나 이상의 GDL 항목을 묶어 지정합니다. 이러한 항목 중 템플릿 또는 매크로에 대한 정규화되지 않은 참조가 포함된 경우 해당 참조의 확인은 *UsingNameSpace 구문의 영향을 받습니다. 이 구문의 인스턴스 이름으로 제공되는 기호는 검색할 네임스페이스를 식별합니다.

여러 구문을 중첩하여 여러 네임스페이스를 지정할 수 있습니다. 검색 순서는 가장 안쪽 *UsingNameSpace 구문으로 시작하여 바깥쪽으로 진행됩니다. 지정된 네임스페이스에 템플릿 정의가 있으면 검색이 중지되고 해당 템플릿이 사용됩니다. 명시적으로 지정된 네임스페이스를 모두 검색했지만 일치하는 항목이 없으면, 파서는 가장 안쪽의 *DefineInNameSpace 구문부터 바깥쪽으로 이름이 지정된 네임스페이스를 검색합니다. 그리고 해당 검색이 참조를 해결하지 못하면 "명명되지 않은" 네임스페이스를 검색하려고 시도합니다.

메모 외부 영향으로부터 네임스페이스 검색 순서를 격리해야 하는 경우 *UsingNameSpace 구문을 사용하여 참조를 확인하는 데 필요한 모든 네임스페이스를 지정해야 합니다.

호스트가 포함된 파일을 추가 *UsingNameSpace 구문으로 둘러싸고 *DefineInNameSpace 구문으로 명명된 네임스페이스 전에 호스트에서 지정한 네임스페이스를 검색하므로 *DefineInNameSpace 구문을 사용하여 검색 순서를 설정해서는 안 됩니다.

예를 들어 앞에서 정의한 템플릿은 템플릿 이름 확인에 사용하도록 명시적으로 지정된 두 개의 네임스페이스를 보여 줍니다. *UsingNameSpace로 명명된 모든 네임스페이스는 이전에 *DefineInNameSpace에 의해 정의되어 있어야 합니다. 예외는 항상 존재하고 NULL 기호로 이름이 지정된 "명명되지 않은" 네임스페이스입니다.

다음 코드 예제에서는 "명명되지 않은" 네임스페이스를 지정하여 검색 순서를 정의하는 방법을 보여 있습니다.

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

앞의 예제에서는 명시적으로 지정된 네임스페이스의 모든 검색이 실패한 후 "명명되지 않은" 네임스페이스를 검색하지만, 이 예제에서는 NSName2 네임스페이스 이전에 "명명되지 않은" 네임스페이스를 검색할 것을 명시적으로 지정합니다.

GDL 데이터 항목은 템플릿 이름을 명시적으로 참조하지 않으므로 *UsingNameSpace를 사용하면 각 데이터 항목에 할당된 템플릿에 영향을 미치지 않습니다. 그러나 *UsingNameSpace에서 지정하는 네임스페이스 검색 순서(첫 번째 GDL 데이터 항목이 구문 분석될 때 적용됨)는 ROOT 템플릿을 검색하는 데 사용됩니다. 하나 이상의 GDL 헤더 파일을 포함하는 경우 실수로 데이터 항목을 정의하는 첫 번째 파일이 되지 않도록 해야 하므로 ROOT 템플릿을 찾는 데 사용되는 네임스페이스를 결정해야 합니다.

메모 매크로 정의는 바깥쪽 중첩 수준에 의해 범위가 제한됩니다. 그러나 네임스페이스 중첩 수준은 매크로 범위가 해당 네임스페이스 외부에 표시될 만큼 크지 않은 경우 특정 네임스페이스에 속하도록 매크로를 정의할 필요가 없기 때문에 매크로 정의 범위를 제한하지 않습니다.

네임스페이스 구문은 다른 형식의 구문 간에 인터리브할 수 있습니다. 네임스페이스 구문을 표시할 수 있는 위치에 대한 제한은 거의 없습니다. 네임스페이스가 아닌 구성 요소는 네임스페이스 확인에 영향을 미치지 않습니다.