Skip to content

类型别名 (Type Aliases)


变量或对象类型的附加名称

概述

声明

重载解析

指向过程指针的指针

类型前向声明

不完整类型

概述

类型别名是类型的替代名称。它们可用于方便地将一种类型批量更改为另一种类型、节省输入,或使循环依赖成为可能。

声明

类型别名使用 Type 关键字声明,方式与使用 ExternDim 声明变量或对象类似。

以下示例为 Single 声明了一个名为 "float" 的类型别名,声明了一个过程,并定义和初始化了两个该类型的变量:

start GeSHi

vb
Type float As Single

Declare Function add (a As float, b As float) As float

Dim foo As float = 1.23
Dim bar As float = -4.56

end GeSHi

过程指针类型别名以相同方式声明,如以下示例所示:

start GeSHi

vb
Declare Function f (ByRef As String) As Integer

Type func_t As Function (ByRef As String) As Integer

Dim func As func_t = @f
       
Function f (ByRef arg As String) As Integer
    Function = CInt(arg)
End Function

end GeSHi

重载解析

类型别名就是别名。从所有意图和目的来看,类型别名就是它所别名的类型。因此,就过程重载解析而言,带有类型为 "alias_to_T" 参数的过程声明与带有类型为 "T" 参数的过程声明相同(同样适用于成员过程的重载)。

换句话说,如果声明参数仅在类型和其别名上有所不同的过程,会产生重复定义错误,如以下示例所示:

start GeSHi

vb
Type float As Single

Declare Sub f Overload (a As Single)

'' 如果取消注释以下行,将会产生重复定义错误
'' Declare Sub f (a As float)

end GeSHi

指向过程指针的指针

指向过程指针的指针与其他任何指针类型一样,只是它们指向过程指针。由于声明过程指针的语法不允许在过程是函数时直接创建指向过程指针的指针(因为 ptr 应用于返回类型而非过程本身),所以需要使用类型别名。

以下示例声明了一个指向返回整数指针的过程的指针,以及一个指向返回整数的过程的指针的指针:

start GeSHi

vb
Dim pf As Function() As Integer Ptr

Type pf_t As Function() As Integer
Dim ppf As pf_t Ptr

end GeSHi

类型前向声明

类型别名可以进行前向引用:别名可以引用尚未完整定义的其他类型。

start GeSHi

vb
Type foo As bar

Type sometype
  f   As foo Ptr
End Type

Type bar
  st  As sometype
  a   As Integer
End Type

end GeSHi

使用类型别名和前向引用允许类型之间存在循环依赖。

start GeSHi

vb
Type list As list_

Type listnode
  parent As list Ptr
  text As String
End Type

Type list_
  first As listnode Ptr
  count As Integer
End Type

end GeSHi

不完整类型

在已知类型的大小(即它在内存中占用的字节数)以及其所有字段的偏移量之前,该类型被认为是不完整的。无法为不完整类型分配空间,也无法声明具有不完整类型数据类型的变量,无法将不完整类型作为参数传递,也无法访问不完整类型的成员。

但是,指向不完整类型的指针可以被分配、声明为其他类型中的成员,或作为参数传递给过程,因为指针的大小是已知的。

start GeSHi

vb
Type sometype As sometype_

'' 不允许,因为 sometype 的大小未知
'' TYPE incomplete
''   a AS sometype
'' END TYPE

'' 允许,因为指针的大小已知
Type complete
  a As sometype Ptr
End Type
Dim x As complete

'' 不允许,因为 sometype 的大小仍然未知
'' DIM size_sometype AS INTEGER = SIZEOF( sometype )

'' 完成类型的定义
Type sometype_
  value As Integer
End Type

'' 现在类型已完成,以下允许
Dim size_sometype As Integer = SizeOf( sometype )

Type completed
  a As sometype
End Type

Dim size_completed As Integer = SizeOf( completed )

end GeSHi

返回 目录

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