共用方式為


GDL 命名空間

GDL 剖析器不允許多次定義具有相同名稱的範本。 兩個獨立撰寫的範本檔案不小心對範本使用相同的名稱,並阻止您在 GDL 檔案中包含這兩個範本檔案。

為了避免名稱衝突問題,GDL 支援命名空間。 標頭檔作者可以藉由將整個定義括在 *DefineInNameSpace 建構內,來指定每個範本和巨集定義應該屬於哪個命名空間。 提供作為這個建構實例名稱的符號將會成為所有封入定義所屬的命名空間。 如果定義位於兩個或多個巢狀 *DefineInNameSpace 建構內,它只會屬於最內層 *DefineInNameSpace 建構所定義的命名空間。 如果定義不在任何 *DefineInNameSpace 建構中,則會指派給預設或「未命名」命名空間。

如果組成樣板或宏建構主體的專案包含在個別的 *DefineInNameSpace 建構內,剖析器將不會將這些個別專案放在新的命名空間中,因為個別專案不是個別的定義,因此它們不能位於不同的命名空間中。 區塊宏允許巢狀巨集定義,而且這些巢狀定義可以指派給其他命名空間。 不過,變更巢狀定義的命名空間並不會延長其存留期。 巢狀巨集定義只能在其定義所在的巢狀層級內參考。

範本或宏名稱可以在命名空間中的限定或未限定形式中參考。 若要限定範本或宏名稱,命名空間名稱只會加上範本或宏名稱的前置詞,例如 NamespaceMacroName) 等冒號字元 (。

注意 提供做為 *Template、*Macros 或 *BlockMacro 定義的符號名稱不能由命名空間限定。 定義的命名空間只能使用 *DefineInNameSpace 來定義。

例如,在名為 「TEMPNAME」 的範本定義于名為 「NSName」 的命名空間內之後,該範本可以使用命名空間限定格式由另一個範本定義參考,如下列程式碼範例所示。

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

此範本現在可以使用命名空間限定語法從另一個範本參考,如下列程式碼範例所示。

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

如果大部分的範本參考都會參考相同的命名空間,或者如果兩個或多個命名空間中參考的範本名稱之間沒有名稱衝突,您可以省略命名空間限定詞,並只提供範本名稱,並依賴剖析器來搜尋命名空間清單,直到找到相符的範本為止。

命名空間清單是藉由在 *UsingNameSpace 建構中括住一或多個 GDL 專案來指定。 如果其中任何一個專案包含範本或宏的不限定參考,這些參考的解析將會受到 *UsingNameSpace 建構的影響。 這個建構實例名稱所提供的符號會識別要搜尋的命名空間。

您可以巢狀數個建構來指定多個命名空間。 搜尋順序從最內層的 *UsingNameSpace 建構開始,然後向外繼續。 如果在指定的命名空間中找到範本定義,則會停止搜尋,並使用該範本。 如果在搜尋所有明確指定的命名空間之後找不到相符專案,剖析器會從最內層建構向外搜尋每個封入 *DefineInNameSpace 建構中命名的命名空間。 如果該搜尋無法解析參考,它會嘗試搜尋「未命名」命名空間。

注意 如果您需要隔離命名空間搜尋順序與外部影響,則必須使用 *UsingNameSpace 建構來指定解析參考所需的所有命名空間。

您不應該依賴 *DefineInNameSpace 建構來建立搜尋順序,因為主機可能會以其他 *UsingNameSpace 建構括住包含的檔案,而且會在 *DefineInNameSpace 建構所命名的命名空間之前搜尋主機指定的命名空間。

例如,稍早定義的範本顯示已明確指定用於範本名稱解析的兩個命名空間。 由 *UsingNameSpace 命名的任何命名空間都必須先前由 *DefineInNameSpace 定義。 例外狀況是「未命名」命名空間,它一律存在,並以 Null 符號命名。

下列程式碼範例示範如何指定「unnamed」 命名空間來定義搜尋順序。

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

在上述範例中,在明確指定命名空間中的所有搜尋都失敗之後,將會搜尋 「unnamed」 命名空間,但此範例會明確指定在 NSName2 命名空間之前搜尋「unnamed」 命名空間。

因為 GDL 資料項目永遠不會明確參考範本名稱,所以使用 *UsingNameSpace 不會影響指派給每個資料項目的範本。 不過,*UsingNameSpace 指定的命名空間搜尋順序 (,在剖析第一個 GDL 資料項目時生效,) 用於搜尋 ROOT 範本。 如果您要包含一或多個 GDL 標頭檔,您應該確定它們不會不小心成為定義資料輸入的第一個檔案,因此會決定用來尋找 ROOT 範本的命名空間。

注意 巨集定義的範圍受限於封入巢狀層級。 不過,命名空間巢狀層級不會限制巨集定義的範圍,因為如果宏的範圍不夠大,無法顯示在該命名空間之外,就不需要定義宏屬於特定命名空間。

命名空間建構可以在其他類型的建構之間交錯。 幾乎沒有任何命名空間建構可以出現的限制。 非命名空間建構不會影響命名空間解析。