ページの先頭行へ戻る
Interstage Application Server V13.0.0 アプリケーション作成ガイド(CORBAサービス編)
FUJITSU Software

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つのスコープが形成されます。



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