多くの場合、typedef は抽象グループ化を示します。例えば、address という名前のレコード・パーツを宣言して、情報を streetAddress1、streetAddress2、および city に分割できます。 従業員レコードに構造体項目 workAddress と homeAddress が含まれている場合、これらの構造体項目はいずれも address という名前のレコード・パーツの形式を指すことができます。 このように typedef を使用することにより、アドレス形式 が同じになります。
このページに記載された一連の規則の範囲内で、他のパーツを宣言するときや 変数を宣言するときにパーツの形式を指すことができます。
パーツを宣言するときはパーツを typedef として使用する必要はありませんが 、使用しても構いません。使用例を後述します。また、データ項目の特性を持つ変数を宣言するときに typedef を使用する必要はありません。代わりに変数のすべての特性を指定するこ とができます。パーツを参照する必要はありません。
typedef は、データ項目よりも複雑な変数を宣言する場合も常に 有効です。例えば、myRecord という名前の変数を宣言し、myRecordPart という名前のパーツの形式を指した場合、EGL では宣 言された変数はそのパーツをモデルとして参照します。myRecordPart02 という名前のパーツの形式を指した場合は、変数の名前は myRecord になりますが、この変数は myRecordPart02 という名前のパーツの特性をすべて保持します。
次の表およびセクションに、さまざまなコンテキストにおける typedefs の詳細を示します。
typedef を指すエントリー | typedef が参照できるパーツのタイプ |
---|---|
関数仮パラメー ターまたはその他の関数変数 | レコード・パーツまたは dataItem パーツ |
プログラム・パラメーター | データ項目パーツ、書式パーツ、レコード・パーツ |
program variable (non-parameter) | データ項目パーツ、レコード・パーツ |
構造体項目 | データ項目パーツ、レコード・パーツ |
DataItem myPart CHAR(20) end Record myRecordPart type basicRecord 10 mySI myPart; // myPart が 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 // mySI がプリミティブ型を持ち、パーツの形式 // (この場合は myPart) を指すため無効です。 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
2 番目のレコード・パーツは以下の宣言と同等です。
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
最後の 2 つのレコード・パーツは、以下の宣言と同等です。
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 // myFirst がプリミティブ型を持ち、パーツの形式 // を指すため無効です。 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 レコードの内部レイアウト