Any
 
Any以各种方式用作类型或值的占位符。

语法

Dim identifier As Any Pointer|Ptr
or
Declare Sub|Function identifier ( ByRef identifier As Any [ , ... ] )
or
Dim identifier (Any [, Any...]) As DataType
or
[ Declare ] { Sub | Function } proc_name ( param (Any [, Any...]) As DataType )
or
Dim identifier As DataType = Any
or
New DataType ( Any )
or
New(Address) DataType [count ] { Any }
or
InStr|InStrRev ( string , Any substring )

说明


  • 指针:
称为Any Ptr(或“Any Pointer”)的特殊指针类型允许指向任何变量类型。如果您将其转换为DataType Ptr,则可以索引或取消引用以访问内存,作为DataType 的实例。指针算术允许在Any Ptr上,并像Byte Ptr一样对待:指针以1的增量更改。

纯粹的Any Ptr没有编译器的类型检查。它可以通过赋值或参数传递隐式转换为其他指针类型。

Any本身不是变量的有效数据类型。此外,取消引用Any Ptr(尽管Any Ptr Ptr可能被取消引用以生成Any Ptr)是非法的。

这不应该与可以包含任何类型的变量的Visual Basic数据类型Variant相混淆。FreeBASIC不提供Variant类型的本地支持。
  • Byref参数:
Any可以在具有ByRef参数的过程原型(Declare语句中)中使用,以禁用编译器检查传递的变量的正确类型。Any的使用已被弃用,仅与QB兼容。
  • 阵列尺寸:
在数组声明中,可以指定Any代替数组边界,以创建一个基于指定的Any数量确定的一定维度的动态数组(使用Any的语法)在Type内声明一个动态数组成员时是强制的)。

在参数声明中,也可以指定Any而不是空括号,以修正维度。
  • 初始化:
Any可以用作伪初始化器,以将变量的默认初始化禁用为0,使变量未初始化。这可以节省程序的关键部分的时间。程序有责任在读取变量之前填写有意义的数据。

与C / C ++的比较:这与C / C ++中没有初始化值的变量声明的行为相匹配。

类似于Any变量的初始化器,Any也可以与NewPlacement New运算符一起使用,以便将新创建的对象未初始化(仅允许使用不具有构造函数的数据类型)。
  • Instr/InstrRev:
Any可以与InStrInStrRev一起用作substring 参数的限定符,以指示其中的任何单个字符可能匹配。

例子

Declare Sub echo(ByVal x As Any Ptr) ''echo将接受任何指针类型

Dim As Integer a(0 To 9) = Any ''此变量未初始化
Dim As Double  d(0 To 4)

Dim p As Any Ptr

Dim pa As Integer Ptr = @a(0)
Print "未初始化";
echo pa       ''传递回指针到整数

Dim pd As Double Ptr = @d(0)
Print "初始化";
echo pd       ''传递一个指针来回显一次

p = pa     ''指定p指向整数的指针
p = pd     ''赋值给一个指向double的指针

Sleep

Sub echo (ByVal x As Any Ptr)
    Dim As Integer i
    For i = 0 To 39
        'echo将指针中的数据解释为字节
        Print Cast(UByte Ptr, x)[i] & "";
    Next
    Print
End Sub


'任何禁用变量类型检查的示例
Declare Sub echo (ByRef a As Any) ''任何禁止检查传递给函数的数据类型

Dim x As Single
x = -15
echo x                  ''将单个传递给期望为整数的函数。编译器不抱怨!
Sleep

Sub echo (ByRef a As Integer)
  Print Hex(a)         
End Sub



Dim a(Any) As Integer '一维动态数组
Dim b(Any, Any) As Integer '二维动态数组
Dim c(Any, Any, Any) As Integer '3维动态数组
'等等

'进一步的Redims或数组访问必须具有匹配的维数
ReDim a(0 To 1) As Integer
ReDim b(1 To 10, 2 To 5) As Integer
ReDim c(0 To 9, 0 To 5, 0 To 1) As Integer


方言差异

与QB差别

  • 指针和初始化器是FreeBASIC的新特性。

参考