Skip to content

CVA_ARG


从可变参数列表对象中获取下一个参数的宏。

语法

variable = cva_arg ( argument_list, datatype )

参数

argument_list

用于访问下一个值的 cva_list 数据类型变量

datatype

可变参数列表 argument_list 中下一个值的数据类型

说明

cva_arg 宏允许在函数中使用可变数量的参数:

  • cva_arg 返回列表 argument_list 中当前参数,预期数据类型为 datatype
  • 首次使用 cva_arg 之前,必须使用命令 cva_startcva_copy 初始化 argument_list
  • cva_arg 在获取当前参数值后,自动将 argument_list 递增到列表中的下一个参数。

示例

start GeSHi

vb
'' Example of a simple custom printf
Sub myprintf CDecl(ByRef formatstring As String, ...)
    Dim As cva_list args

    '' Initialize the cva_list object to first var-arg
    cva_start( args, formatstring )

    '' For each char in format string...
    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

        '' Is it a format char?
        If (char = Asc("%")) Then
            If (todo = 0) Then
                '' % at the end
                Print "%";
                Exit While
            End If

            '' The next char should tell the type
            char = *p
            p += 1
            todo -= 1

            '' Print var-arg, depending on the type
            Select Case char
            '' integer?
            Case Asc("i")
                Print Str(cva_arg(args, Integer));

            '' long integer? (64-bit)
            Case Asc("l")
                Print Str(cva_arg(args, LongInt));

            '' single or double?
            '' Note: because the C ABI, all singles passed on
            '' var-args are converted to doubles.
            Case Asc( "f" ), Asc( "d" )
                Print Str(cva_arg(args, Double));

            '' string?
            Case Asc("s")
                '' Strings are passed byval, so the length is unknown
                Print *cva_arg(args, ZString Ptr);

            End Select

        '' Ordinary char, just print as-is
        Else
            Print Chr( char );
        End If
    Wend

    cva_end( args )

End Sub

Dim As String s = "bar"

myprintf(!"integer=%i, longint=%l single=%f, double=%d, string=%s, string=%s\n", _
         1, 1ll Shl 32, 2.2, 3.3, "foo", s)

end GeSHi

版本

  • 自 fbc 1.07.0 起支持

方言差异

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

与 QB 的差异

  • FreeBASIC 新增特性

另请参阅

  • ... (Ellipsis)
  • cva_copy
  • cva_end
  • cva_list
  • cva_start

返回 目录

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