NAMESPACE
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgNamespace
- 最后更新: 2021-09-28
声明命名空间块。
语法
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
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
'' 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 新增功能
参见
返回 目录