va_first
 
返回指向变量参数列表中第一个参数的指针

语法

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


方言差异

  • -lang qb 方言中不可用,除非使用别名__Va_first引用。

与QB差别

  • 新的FreeBASIC

参考