类型别名 (Type Aliases)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgTypeAliases
- 最后更新: 2016-05-14
变量或对象类型的附加名称
概述
类型别名是类型的替代名称。它们可用于方便地将一种类型批量更改为另一种类型、节省输入,或使循环依赖成为可能。
声明
类型别名使用 Type 关键字声明,方式与使用 Extern 或 Dim 声明变量或对象类似。
以下示例为 Single 声明了一个名为 "float" 的类型别名,声明了一个过程,并定义和初始化了两个该类型的变量:
start GeSHi
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.56end GeSHi
过程指针类型别名以相同方式声明,如以下示例所示:
start GeSHi
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 Functionend GeSHi
重载解析
类型别名就是别名。从所有意图和目的来看,类型别名就是它所别名的类型。因此,就过程重载解析而言,带有类型为 "alias_to_T" 参数的过程声明与带有类型为 "T" 参数的过程声明相同(同样适用于成员过程的重载)。
换句话说,如果声明参数仅在类型和其别名上有所不同的过程,会产生重复定义错误,如以下示例所示:
start GeSHi
Type float As Single
Declare Sub f Overload (a As Single)
'' 如果取消注释以下行,将会产生重复定义错误
'' Declare Sub f (a As float)end GeSHi
指向过程指针的指针
指向过程指针的指针与其他任何指针类型一样,只是它们指向过程指针。由于声明过程指针的语法不允许在过程是函数时直接创建指向过程指针的指针(因为 ptr 应用于返回类型而非过程本身),所以需要使用类型别名。
以下示例声明了一个指向返回整数指针的过程的指针,以及一个指向返回整数的过程的指针的指针:
start GeSHi
Dim pf As Function() As Integer Ptr
Type pf_t As Function() As Integer
Dim ppf As pf_t Ptrend GeSHi
类型前向声明
类型别名可以进行前向引用:别名可以引用尚未完整定义的其他类型。
start GeSHi
Type foo As bar
Type sometype
f As foo Ptr
End Type
Type bar
st As sometype
a As Integer
End Typeend GeSHi
使用类型别名和前向引用允许类型之间存在循环依赖。
start GeSHi
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 Typeend GeSHi
不完整类型
在已知类型的大小(即它在内存中占用的字节数)以及其所有字段的偏移量之前,该类型被认为是不完整的。无法为不完整类型分配空间,也无法声明具有不完整类型数据类型的变量,无法将不完整类型作为参数传递,也无法访问不完整类型的成员。
但是,指向不完整类型的指针可以被分配、声明为其他类型中的成员,或作为参数传递给过程,因为指针的大小是已知的。
start GeSHi
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
返回 目录