返回指向变量参数列表中第一个参数的指针
语法
pointer_variable = va_first()
说明
va_first函数提供了一个非类型
指针值,指向传递给函数的第一个变量参数。
例子
Function average cdecl(count As Integer, ... ) As Double
Dim arg As Any Ptr
Dim sum As Double = 0
Dim i As Integer
arg = va_first()
For i = 1 To count
sum += va_arg(arg, Double)
arg = va_next(arg, Double)
Next
Return sum / count
End Function
Print average(4, 3.4,5.0,3.2,4.1)
Print average(2, 65.2,454.65481)
Sleep
输出将如下所示:
3.925
259.927405
''一个简单的自定义printf的例子
Sub myprintf cdecl(ByRef formatstring As String, ...)
''获取指向第一个var-arg的指针
Dim As Any Ptr arg = va_first()
''对于格式字符串中的每个字符串...
Dim As UByte Ptr p = StrPtr(formatstring)
Dim As Integer todo = Len(formatstring)
While (todo > 0)
Dim As Integer char = *p
p += 1
todo -= 1
''是格式char吗?
If (char = Asc("%")) Then
If (todo = 0) Then
''% 最后
Print "%";
Exit While
End If
''下一个字符应该告诉类型
char = *p
p += 1
todo -= 1
''打印var-arg,具体取决于类型
Select Case char
''整数?
Case Asc("i")
Print Str(va_arg(arg, Integer));
''注意,不同于C:va_next()必须是
'' used as va_arg() won't更新指针。
arg = va_next(arg, Integer)
''长整数? (64位)
Case Asc("l")
Print Str(va_arg(arg, LongInt));
arg = va_next(arg, LongInt)
''单身还是双人?
''注意:因为C ABI,所有的单打都过去了
''var-args被转换为双精度。
Case Asc( "f" ), Asc( "d" )
Print Str(va_arg(arg, Double));
arg = va_next(arg, Double)
''串?
Case Asc("s")
''字符串被通过,所以长度是未知的
Print *va_arg(arg, ZString Ptr);
arg = va_next(arg, ZString Ptr)
End Select
''普通字符,只是按原样打印
Else
Print Chr( char );
End If
Wend
End Sub
Dim As String s = "酒吧"
myprintf(!"integer =%i,longint =%l single =%f,double =%d,string =%s,string =%s \\ n", _
1, 1ll Shl 32, 2.2, 3.3, "FOO", s)
Sleep
方言差异
与QB差别
参考