typedef 通常标识抽象分组。例如,可以声明一个名为 address 的记录部件,并将信息划分成 streetAddress1、streetAddress2 和 city。如果个人记录包含结构项 workAddress 和 homeAddress,则每一个结构项都可以指向名为 address 的记录部件的格式。这样使用 typedef 可以确保地址的格式相同。
在本页描述的规则集中,可在声明一个部件或在声明变量时指向另一个部件的格式。
当声明部件时,不需要将部件用作 typedef,但是您可能想这样做,正如在稍后显示的示例中所示。并且,当声明具有数据项特征的变量时,不需要使用 typedef;或者,可以指定变量的所有特征,而不引用部件。
在声明比数据项更复杂的变量时,typedef 始终有效。例如,如果声明名为 myRecord 的变量并指向名为 myRecordPart 的部件的格式,则 EGL 将根据该部件建立所声明的变量的模型。如果指向名为 myRecordPart02 的部件的格式,则变量将称为 myRecord,但它具有名为 myRecordPart02 的部件的所有特征。
下表以及下列各节提供了有关不同上下文中的 typedef 的详细信息。
指向 typedef 的条目 | typedef 可以引用的部件类型 |
---|---|
函数参数或其它函数变量 | 记录部件或 dataItem 部件 |
程序参数 | dataItem 部件、表单部件和记录部件 |
程序变量(非参数) | dataItem 部件和记录部件 |
结构项 | 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 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
当声明指向另一部件格式的结构项时,您指定 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 会向包含结构项的结构部件添加一层结构。为此,上一个示例中的内部结构具有结构项层次结构,并且 person 与 streetAddress1 处于不同的层次级别。
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
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
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
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,并且该结构项的长度就是下级结构项表示的字节数,而不管这些结构项的基本类型。有关其它详细信息,请参阅“结构”。
仅当声明程序参数时才可以将表单部件用作 typedef。
相关概念
DataItem 部件
表单部件
EGL 简介
记录部件
固定结构
相关任务
创建 EGL 程序部件
相关参考
EGL 语句
SQL 记录内部结构