Typedef

型定義 (typedef) は形式のモデルとして使用されるパーツです。 typedef メカニズムは以下のような理由で使用します。

多くの場合、typedef は抽象グループ化を示します。例えば、address という名前のレコード・パーツを宣言して、情報を streetAddress1streetAddress2、および city に分割できます。従業員レコードに構造体項目 workAddresshomeAddress が含まれている場合、これらの構造体項目はいずれも address という名前のレコード・パーツの形式を指すことができます。このように typedef を使用することにより、アドレス・フォーマットが同じになります。

このページに記載された一連の規則の範囲内で、他のパーツを宣言するときや変数を宣言するときにパーツの形式を指すことができます。

パーツを宣言するときはパーツを typedef として使用する必要はありませんが 、使用しても構いません。使用例を後述します。また、データ項目の特性を持つ変数を宣言するときに typedef を使用する必要はありません。代わりに変数のすべての特性を指定することができます。パーツを参照する必要はありません。

typedef は、データ項目よりも複雑な変数を宣言する場合も常に 有効です。例えば、myRecord という名前の変数を宣言し、myRecordPart という名前のパーツの形式を指した場合、EGL では宣 言された変数はそのパーツをモデルとして参照します。myRecordPart02 という名前のパーツの形式を指した場合は、変数の名前は myRecord になりますが、この変数は myRecordPart02 という名前のパーツの特性をすべて保持します。

次の表およびセクションに、さまざまなコンテキストにおける typedefs の詳細を示します。

typedef を指すエントリー typedef が参照できるパーツのタイプ
関数仮パラメー ターまたはその他の関数変数 レコード・パーツまたは dataItem パーツ
プログラム・パラメーター データ項目パーツ、書式パーツ、レコード・パーツ
program variable (non-parameter) データ項目パーツ、レコード・パーツ
構造体項目 データ項目パーツ、レコード・パーツ

typedef としてのデータ項目パーツ

以下のような場合にデータ項目パーツを typedef として使用できます。
  • 変数またはパラメーターを宣言するとき
  • レコード・パーツ、書式パーツ、または dataTable パーツのサブユニットである構造体項目を宣言するとき
以下の規則が適用されます。
  • 構造体項目が同じ宣言内にリストされた他の構造体項目の親である場合、そ の構造体項目は、以下の例に示すようにデータ項目パーツの形式のみを指すことができます。
      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
  • データ項目パーツを typedef として使用することはできません。また、typedef を指すエンティティーの長さやプリミティブ型を指定することもできません。
      DataItem myPart HEX(20) end
    
      // mySI がプリミティブ型を持ち、パーツの形式
    // (この場合は myPart) を指すため無効です。
    Record myRecordPart type basicRecord
        10 mySI CHAR(20) myPart;
      end
  • レコード・パーツを参照しない変数宣言は、デー タ項目パーツの形式を指すか、または基本特性を持ちます。(プログラム・パラメーターは、書式パーツも参照できます。) ただし、データ項目パーツでは別のデータ項目パーツの形式や他のパーツを指すことはできません。
  • 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

    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 ではその構造体項目を含む構造体パーツに階層レベルが追加されます。このため、前述の例の内部構造体には 構造体と項目の間に階層が生じ、personstreetAddress1 と異 なるレベルになります。

  • 場合によっては、単層の構造の方が良い場合もあります。また、リレーショナル・データベースにアクセスする I/O オブジェクトである SQL レコードは、単層構造でなければなりません
    • 前出の例では、レコード・パーツの構造体項目名 (この場合 homeAddress) をワード embed と置換して、 そのワードの後に 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 で識別される構造体項目には、以下の制限事項があります。
      • レコード・パーツの形式を指すことはできるが、データ項目パーツを指すことはで きない
      • 配列を指定したりプリミティブ型の指定を組み込むことは できない
    • 次に、2 つのレコードに同一構造を宣言する際に、レコード・パーツが 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

      最後の 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
  • 構造体項目を連続して宣言するときに、レコード・パーツを typedef として複数回使用できます。このような再利用は、自宅の住所と職場の住所が含まれた従業員レコー ド・パーツを宣言する場合などに有用です。基本レコードを使用して、以下のように構造内の 2 つのロケーションに同じ形式を記述できます。
      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
    
      // 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
    2 番目の構造体は以下の宣言と同等です。
      Record myStruct02 type basicRecord
        10 myFirst;
          20 next01 HEX(20);
          20 next02 HEX(20);
      end

    従属構造体項目を持つすべての構造体項目のプリミティブ型は、従属構造体項目のプリミティブ型に関係なくデフォルトで CHAR であ り、構造体項目の長さは従属構造体項目によって表されるバイト数です。詳細については、『構造体』を参照してください。

  • SQL レコードに関連して、以下の制限事項があります。
    • SQL レコード・パーツが typedef として他の SQL レコード・パーツを使用している場合には、typedef が提供するそれぞれの項目には、4 バイトの接頭部が含まれます。非 SQL レコードが SQL レコード・パーツを typedef として使用している場合には、接頭部は含まれません。 背景情報については、『SQL レコードの詳細 』を参照してください。
    • SQL レコード・パーツは、typedef として以下のパーツ型のみ使用できます。
      • 別の SQL レコード・パーツ
      • dataItem パーツ
  • つまり、構造および構造体項目のいずれも typedef として指定することはできません

typedef としての書式

プログラム・パラメーターを宣言する場合に限り、書式パーツを typedef として使用できます。

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.
(C) Copyright IBM Japan 2005.