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

FreeBASIC Namespace

目次→言語リファレンス→命令文→モジュール化NAMESPACE←オリジナル・サイト

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

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

名前空間ブロックを宣言します。

構文:
Namespace identifier [ Alias "aliasname" ]
命令文
End Namespace

パラメタ:
identifier
名前空間の名前。 (入れ子の名前指定子を含む)
aliasname
名前空間のための、代替の外部名。

記述:
名前空間を使うと、オブジェクト(Union と Enum を含む、定義済みのデータ型および UDT) や、手続き(この宣言を含む) のような実体を、名前の下で、グループ化できます。
このように、グローバル範囲は、サブ範囲独自の名前を使って、それぞれ「サブ範囲」に分割することができます。

ソース・ファイルで、明示的に名前空間を宣言するか否かを問わず、コンパイラはデフォルトの名前空間を加えます。
この、名前の付いていない名前空間(グローバル名前空間と呼ばれる)は、あらゆるファイルに存在します。
グローバル名前空間内の識別子は全て、名前付き名前空間で使うことができます。(キーワードが、名前空間の内部で宣言されるかもしれないものと同じ名前を持ったグローバル・シンボルでさえも)

名前空間は、暗黙のうちに、公開アクセスとなり、これは変更できません。
名前空間内で宣言される変数は、たとえ宣言修飾子 Shared が指定されていなくても、常に全プログラムを通して、暗黙のうちに静的で、可視的です。
(static(静的)と shared(共有)は、オプションですが、この記述は、コードを読みやすくするでしょう。)
名前空間内の定義済みシンボルの外側からアクセスするには、シンボルの接頭辞として、名前空間識別子とそれに続くドットを追加するか、Using (Namespaces) 命令文を使って名前空間シンボルを現在の範囲に入れます。

名前空間は、定義の可視性に影響しません。
名前空間は、複数の宣言の中で定めることができます。

名前空間は、一般的に、そのライブラリのすべてのシンボルが、ユーザーの領域(グローバル名前空間と呼ばれます)に入り込まないようにする必要があるライブラリで、使われます。
例えば、あなたが、"Forms" ライブラリを使うとして、これは X と Y 座標を記述するために、Point 型を定義するかもしれません。また、あなたは、別の目的で Point 型を定義するかもしれません。
この重複は、ライブラリのための名前空間 "Forms" を作成し、そして、その Point 型を Forms.Point と呼び、あなたのものは、ただ Point と呼ぶことで、解決できます。

グローバル名前空間で定義された重複するシンボルにアクセスするには、接頭辞として 1つまたはできれば 2つの点を追加します:.SomeSymbol またはできれば ..SomeSymbolWith..End With ブロック内の場合は ..SomeSymbol のみ)。

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

例:
Namespace Forms
    Type Point '' A 2D point
        As Integer x
        As Integer y
    End Type
    '' 名前空間の中なので、Pointは、Forms.Point で解決します。
    Sub AdjustPoint( ByRef pt As Point, ByVal newx As Integer, ByVal newy As Integer )
        pt.x = newx
        pt.y = newy
    End Sub
End Namespace

Type Point '' A 3D point
    As Integer x
    As Integer y
    As Integer z
End Type

Sub AdjustPoint( ByRef pt As Point, ByVal newx As Integer, ByVal newy As Integer, ByVal newz As Integer )
    pt.x = newx
    pt.y = newy
    pt.z = newz
End Sub

Dim pt1 As Point
AdjustPoint( pt1, 1, 1, 1 )
Dim pt2 As Forms.Point
Forms.AdjustPoint( pt2, 1, 1 )


名前空間は、GCC C++ 互換です。下は、これをテストするためのコードです。
// mylib.cpp
// To compile:
//    g++ -c mylib.cpp -o mylib.o
//    ar rcs libmylib.a mylib.o

#include <string.h>
#include <ctype.h>

namespace mylib
{
    int test()
    {
        return 123;
    }
}


'' test.bas

Extern "c++" Lib "mylib"
    Namespace mylib Alias "mylib"
        Declare Function test() As Integer
    End Namespace
End Extern

Print mylib.test()


方言差:
QBからの違い:
参照:
モジュール化 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2021-09-28 10:02:01
日本語翻訳:WATANABE Makoto、原文著作者:VirusScanner

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

表示-非営利-継承