Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

付録A IDL定義> A.1 IDLの書式

A.1.5 名前とスコープ

 スコープとは、IDL内での名前の一意性を定義するものです。

 スコープを指定する方法には、以下の3つの方法があります。

(1)先頭が識別子で始まるスコープ名(識別子::識別子など)

 先頭が識別子で始まり、各識別子を2つのコロン(::)で接続させたスコープ名をフルスコーと呼びます。フルスコープは、IDLファイルの最上位モジュールからの識別子の並びを指定します。以下の例では、モジュールM3内の定数xの型は、スコープ名"M1::M2::T"で定義した型(short型)となります。

 インタフェースを継承している場合は、そのインタフェースのスコープ名を指定することにより、そのインタフェースが継承しているベースインタフェースの定義を利用することが可能です。以下の例では、インタフェースI3内の定数xの型は、インタフェースI2のベースインタフェースI1にある定義T、すなわちshort型となります。

  module M1 {
      interface  I1 {
          typedef short  T ; 
      };
      interface  I2:I1 {
      };
      interface  I3 {
          const  M1::I2::T  x = 100 ; 
      };
  };

(2)先頭が"::"で始まるスコープ名

 2つのコロン(::)の後ろには、このスコープ名を指定した定義を含むモジュールから下の階層の識別子の並びを指定します。以下の例では、スコープ名"::T"は、このスコープ名を定義した定数を含むモジュールM1内のTが有効となりますので、インタフェースI2内の定数xの型はlong型となります。

  module  M1 {
      typedef long  T ; 
      interface  I1 {
          typedef short  T ; 
      };
      interface  I2 {
          const ::T  x = 100 ; 
      };
  };

(3)識別子のみのスコープ名

 スコープの中では、識別子のみで他の定義を使うことができます。

  module  M {
      typedef long  L ;
      const  L x = 100 ;
  };

 名前が同一スコープ内に存在しない場合は、自らを含む上位スコープを順に探索するので、上位のスコープの名前は以下のようにスコープ名を指定しないで名前だけで参照できます。以下の例では、モジュールM2内で使用しているLは、モジュールM2のスコープ内に存在しませんが、その上位スコープのモジュールM1にLの定義があるので、この定義(long型)が有効になります。

  module  M1 {
      typedef long  L ;
      module  M2 {
           const  L x = 100 ;
      };
  };

 あるスコープで、スコープを指定されていない名前が一度使われると、そのスコープでその名前を再定義することはできません。このような再定義はコンパイルエラーを引き起こします。
 以下の定義を行うと、スコープのネスト化が行われます。

 また、以下の定義を行うと、新たなスコープが形成されます。

 スコープの形成例を以下に示します。この例では3つのスコープが形成されます。

 スコープ内では各定義の識別名が重複してはいけません。なお、ネストしたスコープの中では同じ名前の識別子を定義することができます。各定義の識別子は大文字と小文字との区別をしていないので、大文字か小文字かが違うだけの識別子は、同一とみなされます。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005