Skip to content

NAMESPACE


声明命名空间块。

语法

vb
Namespace identifier [ Alias "aliasname" ]

statements

End Namespace

参数

identifier

命名空间的名称(包括嵌套名称说明符)。

aliasname

命名空间的另一个外部名称。

描述

命名空间允许将对象(预定义数据类型和 UDT,包括 Union 和 Enum)和过程(包括其声明)等实体在一个名称下分组。这样,全局作用域可以被划分为"子作用域",每个子作用域有自己的名称。

无论源文件中是否显式声明命名空间,编译器都会添加一个默认命名空间。这个未命名的命名空间称为全局命名空间,存在于每个文件中。

全局命名空间中的任何标识符都可以在命名命名空间中使用(甚至与关键字同名的全局符号也可以在命名空间内声明)。

命名空间隐式具有公开访问权限,且不可修改。

在命名空间内声明的变量始终是隐式静态的,即使未指定声明修饰符 Shared,它在整个程序中都是可见的(static 和 shared 是可选的,但这可以提高代码可读性)。

命名空间对 define 的可见性没有任何影响。

可以在两个或多个声明中定义一个命名空间。

命名空间通常用于库中,你不希望该库中的所有符号占用用户的空间(称为全局命名空间)。

例如,如果你使用了 "Forms" 库,它可能定义了 Point 类型来描述 X 和 Y 坐标,而你可能也为其他目的定义了它。可以通过为库创建命名空间 Forms 来解决这个问题,然后将其 Point 类型引用为 Forms.Point,而你的则只是 Point。

要从外部访问命名空间中定义的符号,请在符号前添加命名空间标识符和点作为前缀,或通过 Using(命名空间) 语句将命名空间符号引入当前作用域。

要访问在命名空间外部作为全局定义的重复符号,请添加一个或最好两个点作为前缀:.SomeSymbol 或最好是 ..SomeSymbol(或在 With..End With 块内只用 ..SomeSymbol)。

注意:解析器允许定义匿名命名空间(没有 identifier 项),但这是与实际 C++ 功能的唯一相似之处:FB 编译器在这种情况下会自动生成多个独立的匿名命名空间,而不是每个模块只有一个。

FB 匿名命名空间几乎无法使用,因为其所有声明都无法访问,即使是来自包含它们的模块体也无法访问。除了在内部封装模块构造函数/析构函数之外,无法用它们做任何其他事情。

示例

start GeSHi

vb
Namespace Forms
    Type Point '' A 2D point
        As Integer x
        As Integer y
    End Type
    '' Since we are inside of the namespace, Point resolves to 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 )

end GeSHi

命名空间与 GCC C++ 兼容,以下代码旨在测试这一点。

start GeSHi

// 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;
    }
}

end GeSHi

start GeSHi

vb
'' test.bas

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

Print mylib.test()

end GeSHi

方言差异

  • -lang qb 方言中不支持命名空间。

与 QB 的差异

  • FreeBASIC 新增功能

参见

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系