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