FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgNamespaces

目次→教本→プログラマーのための案内Namespaces←オリジナル・サイト

名前空間 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

Namespace は、識別子のコンテナで、他の Namespaces やグローバル・スコープの識別子と競合しないようにします。

構文
Namespace identifier [ Alias "aliasname" ]
statements
End Namespace

パラメータ
identifier
名前空間の名前(入れ子になった名前指定子を含む)。
aliasname
名前空間の代替外部名。

説明
名前空間は、コンパイラによる、識別子の名前の検索を区切ることができる、宣言項目です。
この目的は、基本的に、識別子を論理的にグループ化して、同じプロジェクトのいくつかの部分の間で、名前の競合を避けることです。
この形態の競合は、デフォルトでは1つのグローバル・スコープだけ提供されていて、そこでは名前の競合が発生しない、という事実に起因しています。
名前空間を使うと、この種の問題をより簡単に回避できます。グローバル・スコープで、グローバル・オブジェクトを定義することを避けられるからです。

名前空間にコードを直接含めることはできません。名前空間で宣言された手続き内でのみできます。
これは、名前空間がスコープではなく、実行されるものではなく、ただ宣言を保持するために使えるものだからです。

名前空間で宣言された変数は、暗黙的に静的であり、プログラム全体で表示されます(StaticShared キーワードは使えません)。
したがって、定数を持つ初期化子のみが、許可されます。

用法
Type などの別の宣言領域とは異なり、名前空間はいくつかの部分に分割できます。
最初の部分は宣言として機能し、次の部分は拡張として機能します。
名前空間拡張の構文は、宣言部分の構文と、まったく同じです。
同じ名前空間内で、宣言または定義された識別子は、競合してはなりません。
それらは同じ名前を持つ場合がありますが、多重定義の一部としてのみです。
したがって、名前空間は、Type の宣言項目、およびグローバル・スコープと、まったく同じように動作します。

名前空間識別子へのアクセスは、名前空間の名前から使う識別子の名前に接頭辞を付けるために、解決演算子 (".") を使います。
ただし、この接頭辞は、名前空間自体の内部では使えず、メンバー Type 内のメンバーと同じです。
名前空間のメンバー手続きは、この空間内で定義できます。
解決演算子(名前空間の名前の接頭辞)が使われている場合は、メンバーは、この空間の外側に設定することもできます。
このように定義された手続きは、名前空間での宣言の後に表示されなければなりません。

名前空間は、別の名前空間の中に定義することができます。
ただし、この宣言は、名前空間を含む名前空間の、最も外側の宣言レベルで発生する必要があります。
名前空間宣言は、手続き本体内や、Type ブロック内に配置できません。

名前空間に非常に複雑な名前がある場合、その名前の別名を定義すると便利な場合があります。
別名は、よりシンプルな名前になります。
名前空間の別名に与えられる名前は、これがグローバル・スコープであるかどうかにかかわらず、同じ名前空間内の他の識別子の名前と競合してはいけません。

注: パーサーは、匿名の名前空間(identifier の用語なし)を定義できますが、これは実際の C++ 能力との唯一の類似点です: FB コンパイラーは、このような場合に、モジュールごとに1つではなく、複数の個別の匿名名前空間を、自動的に生成します。
FB 匿名名前空間は、それを含むモジュールの本体からでも、すべての宣言にアクセスできないので、ほとんど使いものになりません。
内部に、モジュール・コンストラクター/デストラクタをカプセル化すること以外に、他に何もできません。

'Using (Namespaces)' 命令文
Using (Namespaces) により、フルネーム(つまり、名前空間名の後に "." 演算子と識別子名が続く)を指定しなくても、簡略化された方法で名前空間の識別子を使えるようになります。
各 Using コマンは、参照された名前空間のすべての識別子を、直接使えます。

- 構文:
Using identifier [, identifier [, ...] ]

- パラメータ:
identifier: The name of the Namespace to use.

- 用法:
Using コマンドの後でも、名前空間の識別子の完全な名前を使うことはできますが、これはもはや必要ありません。
Using コマンドは、現在のスコープ・ブロックの最後まで、宣言されている行から有効です。
Using 指示の後に、名前空間が拡張される場合、Namespace 拡張で定義された識別子は、using 指示の前に定義された識別子とまったく同じように使えます(つまり、名前空間名の完全な表現なしで)。

複数の名前空間名に Using コマンドを入力すると、名前の競合が発生する場合があります。
この場合、Using コマンドからエラーは報告されませんが、競合する識別子の 1つを使うとエラーが発生します(予想される識別子のフルネームを使うと競合が解決します)。

名前空間の拡張子:
Namespace A  ' Declaration of Namespace A
    Dim As Integer i
End Namespace

Namespace B  ' Declaration of Namespace B
    Dim As Integer i
End Namespace

Namespace A  ' Extension of Namespace A
    Dim As Integer j
End Namespace

名前空間メンバーへのアクセス:
Dim As Integer i  ' Declare i in the global scope

Namespace A
    Dim As Integer i = 2  ' Declare i in Namespace A
    Dim As Integer j = 3  ' Declare j in Namespace A
End Namespace

i = 1    ' Use i from global scope (.i)
A.i = 4  ' Use i from Namespace A (A.i)

名前空間で宣言された関数の外部定義:
Namespace A
    Declare Function f () As Integer  ' Declaration of f() in Namespace A (A.f())
End Namespace

Function A.f () As Integer  ' Definition of f() from Namespace A (A.f())
    Return 0
End Function

入れ子された名前空間の定義:
Namespace A
    Dim As Integer i  ' (A.i)
    Namespace B
        Dim As Integer j  ' (A.B.j)
    End Namespace
End Namespace

'Using (Namespaces)' コマンドを使ったアクセス:
Namespace A
    Dim As Integer i  ' Declaration of A.i
    Dim As Integer j  ' Declaration of A.j
End Namespace

Using A  ' Namespace A identifiers are also used
i = 1  ' Equivalent to A.i
j = 1  ' Equivalent to A.j

'Using (Namespace)' コマンドの後の名前空間の拡張:
Namespace A
    Dim As Integer i
End Namespace

Using A

Namespace A
    Dim As Integer j
End Namespace

i = 0  ' Initialize A.i
j = 0  ' Initialize A.j

'Using (Namespaces)' コマンドを使ったローカル識別子間の競合:
Namespace A
    Dim As Integer i  ' Declare A.i
    Dim As Integer j  ' Declare A.j
End Namespace

Namespace B
    Dim As Integer i  ' Declare B.i
    Dim As Integer j  ' Declare B.j
    Using A           ' A.i/j and B.i/j are in conflict, but no error is given
End Namespace

Dim As Integer j  ' Declare also j the global scope

Using B
'i = 1   ' error: Ambiguous symbol access, explicit scope resolution required (between B.i and A.i)
B.i = 1  ' ambiguity resolution solved by using full name
j = 2    ' ambiguity (between .j, B.j, A.j) solved by compiler, by choosing override .j in the global scope

参照
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-09-28 07:19:44
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承