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