Typedef

类型定义(typedef)是用作格式模型的一个部件。使用 typedef 机制的原因如下所示:

typedef 通常标识抽象分组。例如,可以声明一个名为 address 的记录部件,并将信息划分成 streetAddress1streetAddress2city。如果个人记录包含结构项 workAddresshomeAddress,则每一个结构项都可以指向名为 address 的记录部件的格式。这样使用 typedef 可以确保地址的格式相同。

在本页描述的规则集中,可在声明一个部件或在声明变量时指向另一个部件的格式。

当声明部件时,不需要将部件用作 typedef,但是您可能想这样做,正如在稍后显示的示例中所示。并且,当声明具有数据项特征的变量时,不需要使用 typedef;或者,可以指定变量的所有特征,而不引用部件。

在声明比数据项更复杂的变量时,typedef 始终有效。例如,如果声明名为 myRecord 的变量并指向名为 myRecordPart 的部件的格式,则 EGL 将根据该部件建立所声明的变量的模型。如果指向名为 myRecordPart02 的部件的格式,则变量将称为 myRecord,但它具有名为 myRecordPart02 的部件的所有特征。

下表以及下列各节提供了有关不同上下文中的 typedef 的详细信息。

指向 typedef 的条目 typedef 可以引用的部件类型
函数参数或其它函数变量 记录部件或 dataItem 部件
程序参数 dataItem 部件、表单部件和记录部件
程序变量(非参数) dataItem 部件和记录部件
结构项 dataItem 部件和记录部件

DataItem 部件作为 typedef

在下列情况下,可以将 dataItem 部件用作 typedef:
  • 声明变量或参数时
  • 声明结构项(结构项是记录部件、表单部件或 dataTable 部件的子单元)时
下列规则适用:
  • 如果一个结构项是列示在同一声明中的其它结构项的父代,则该结构项只可指向 dataItem 部件的格式,如以下示例所示:
      DataItem myPart CHAR(20) end
    
      Record myRecordPart type basicRecord
        10 mySI myPart; // myPart acts as a typedef
          20 a CHAR(10);
          20 b CHAR(10);
      end
    
      
    以上记录部件等同于以下声明:
      Record myRecordPart type basicRecord
        10 mySI CHAR(20);
          20 a CHAR(10);
          20 b CHAR(10);
      end
  • 不能将 dataItem 部件用作 typedef 并同时指定指向该 typedef 的实体的长度和基本类型,如以下示例所示:
      DataItem myPart HEX(20) end
    
      // NOT valid because mySI has a primitive type
      // and points to the format of a part (to myPart, in this case)
      Record myRecordPart type basicRecord
        10 mySI CHAR(20) myPart;
      end
  • 不引用记录部件的变量声明将指向 dataItem 部件的格式或者具有基本特征。(程序参数也可以引用表单部件。)但是,dataItem 部件不能指向另一个 dataItem 部件或任何其它部件的格式。
  • SQL 记录部件只能将下列类型的部件用作 typedef:
    • 另一个 SQL 记录部件
    • dataItem 部件

记录部件作为 typedef

在下列情况下,可以将记录部件用作 typedef:
  • 当声明结构项时
  • 当声明变量(包括参数)时,在这种情况下,变量按照下列方式反映 typedef:
    • 格式
    • 记录类型(例如,indexedRecord 或 serialRecord)
    • 属性值(例如,file 属性的值)

当声明指向另一部件格式的结构项时,您指定 typedef 是否添加一层层次结构,如下所示。

下列规则适用:
  • 当使用结构项以便于重用时,记录部件可以是 typedef:
      Record address type basicRecord
        10 streetAddress1 CHAR(30);
        10 streetAddress2 CHAR(30);
        10 city CHAR(20);
      end
    
      
      Record record1 type serialRecord
      {
        fileName = "myFile"
      }
        10 person CHAR(30);
        10 homeAddress address;
      end
    
      

    第二个记录部件等同于以下声明:

      Record record1 type serialRecord
        { fileName = "myFile" }
        10 person CHAR(30);
        10 homeAddress;
          20 streetAddress1 CHAR(30);
          20 streetAddress2 CHAR(30);
          20 city CHAR(20);
      end

    如果结构项使用先前的语法来指向结构部件的格式,则 EGL 会向包含结构项的结构部件添加一层结构。为此,上一个示例中的内部结构具有结构项层次结构,并且 personstreetAddress1 处于不同的层次级别。

  • 在某些情况下,您会想要在结构中采用平面布局;作为用于访问关系数据库的 I/O 对象的 SQL 记录必须具有这样的布局:
    • 在上一个示例中,如果用单词 embed 来替代记录部件的结构项名(在这种情况下为 homeAddress),并且在该单词后面是充当 typedef 的记录部件的名称(在这种情况下为 address),则部件声明看起来类似于:
        Record address type basicRecord
          10 streetAddress1 CHAR(30);
          10 streetAddress2 CHAR(30);
          10 city CHAR(20);
        end
      
        
        Record record1 type serialRecord
        {
          fileName = "myFile"
        }
          10 person CHAR(30);
          10 embed address;
        end
      
        

      记录部件的内部结构现在是平面布局:

        Record record1 type serialRecord
        {
          fileName = "myFile"
        }
          10 person CHAR(30);
          10 streetAddress1 CHAR(30);
          10 streetAddress2 CHAR(30);
          10 city CHAR(20);
        end
      
        
      使用单词 embed 来替换结构项名的唯一原因是为了避免添加一层层次结构。由单词 embed 标识的结构项具有下列限制:
      • 可以指向记录部件的格式,但是不指向 dataItem 部件
      • 不能指定数组或者包括基本类型规范
    • 接下来,考虑当在两个记录中声明完全相同的结构时记录部件是 typedef 的情况:
        Record common type serialRecord
        {
          fileName = "mySerialFile"
        }
          10 a BIN(10);
          10 b CHAR(10);
        end
      
        
        Record recordA type indexedRecord
        {
          fileName = "myFile",
          keyItem = "a"
        }
          embed common; // accepts the structure of common, 
                        // not the properties
        end
      
        
        Record recordB type relativeRecord
        {
          fileName = "myOtherFile",
          keyItem = "a"
        }
          embed common;
        end
      
        

      最后两个记录部件等同于下列声明:

        Record recordA type indexedRecord
        {
          fileName = "myFile",
          keyItem = "a"
        }
          10 a BIN(10);
          10 b CHAR(10);
        end
      
        
        Record recordB type relativeRecord
        {
          fileName = "myOtherFile",
          keyItem = "a"
        }
          10 a BIN(10);
          10 b CHAR(10);
        end
  • 可以在声明一系列结构项时将记录部件多次用作 typedef。此重用是很有意义的,例如,如果您正在声明包含家庭地址和工作地址的个人记录,这就会很有用。基本记录可以在结构中的两个位置提供相同的格式:
      Record address type basicRecord
        10 streetAddress1 CHAR(30);
        10 streetAddress2 CHAR(30);
        10 city CHAR(20);
      end
    
      
      Record record1 type serialRecord
      {
        fileName = "myFile"
      }
        10 person CHAR(30);
        10 homeAddress address;
        10 workAddress address;
      end

    此记录部件等同于以下声明:

      Record record1 type serialRecord
      {
        fileName = "myFile"
      }
        10 person CHAR(30);
        10 homeAddress;
          20 streetAddress1 CHAR(30);
          20 streetAddress2 CHAR(30);
          20 city CHAR(20);
        10 workAddress;
          20 streetAddress1 CHAR(30);
          20 streetAddress2 CHAR(30);
          20 city CHAR(20);
      end
  • 不能将记录部件用作 typedef 并同时指定指向该 typedef 的实体的长度和基本类型,如以下示例所示:
      Record myTypedef type basicRecord
        10 next01 HEX(20);
        10 next02 HEX(20);
      end
    
      
      // not valid because myFirst has a
      // primitive type and points to the format of a part
      Record myStruct02 type serialRecord
      {
        fileName = "myFile"
      }
        10 myFirst HEX(40) myTypedef;
      end
    但是,请参照以下实例:
      Record myTypedef type basicRecord
        10 next01 HEX(20);
        10 next02 HEX(20);
      end
    
      
      Record myStruct02 type basicRecord
        10 myFirst myTypedef;
      end
    第二个结构等同于以下声明:
      Record myStruct02 type basicRecord
        10 myFirst;
          20 next01 HEX(20);
          20 next02 HEX(20);
      end

    缺省情况下,具有下级结构项的任何结构项的基本类型均为 CHAR,并且该结构项的长度就是下级结构项表示的字节数,而不管这些结构项的基本类型。有关其它详细信息,请参阅“结构”。

  • 对于 SQL 记录,下列限制有效:
    • 如果一个 SQL 记录部件将另一个 SQL 记录部件用作 typedef,则该 typedef 提供的每个项都包含 4 个字节的前缀。但是,如果非 SQL 记录将 SQL 记录部件用作 typedef,则不包括前缀。有关背景知识信息,请参阅 SQL 记录内部结构
    • SQL 记录部件只能将下列类型的部件用作 typedef:
      • 另一个 SQL 记录部件
      • dataItem 部件
  • 最后,结构和结构项都不能作为 typedef

表单作为 typedef

仅当声明程序参数时才可以将表单部件用作 typedef。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.