Skip to content

CVA_LIST


可变参数列表对象类型

语法

dim variable as cva_list

说明

cva_list 是用于在可变参数过程中处理可变长度参数列表的内置数据类型。

使用 cva_start 初始化 cva_list 变量(构造函数)。

使用 cva_copy 复制 cva_list 变量(拷贝构造函数)。

使用 cva_arg 获取下一个参数的值。

使用 cva_end 完成对 cva_list 变量的操作(析构函数)。

cva_list 的确切类型和大小因目标平台而异。该内置类型在底层机制之上提供了一层抽象,用于获取传递给可变参数过程的值。

fbc 将根据 -target-arch-gen 命令行选项选择默认的 cva_list 类型,如以下代码所示:

start GeSHi

vb
#if (__FB_BACKEND__ = "gcc")
    #if defined( __FB_64BIT__ )
        #if defined( __FB_ARM__ )
            Type __va_list Alias "__va_list"
                As Any Ptr __stack
                As Any Ptr __gr_top
                As Any Ptr __vr_top
                As Long __gr_offs
                As Long __vr_offs
            End Type
            Type cva_list As __va_list Alias "__builtin_va_list"
        #elseif defined( __FB_WIN32__ )
            Type cva_list As Any Alias "__builtin_va_list" Ptr
        #else
            Type __va_list_tag Alias "__va_list_tag"
                As ulong gp_offset
                As ulong fp_offset
                As Any Ptr overflow_arg_area
                As Any Ptr reg_save_area
            End Type  
            Type cva_list As __va_list_tag Alias "__builtin_va_list[]"
        #endif 
    #else
        Type cva_list As Any Alias "__builtin_va_list" Ptr
    #endif
#else
    Type cva_list As Any Alias "char" Ptr
#endif

end GeSHi

示例

start GeSHi

vb
Function average CDecl(count As Integer, ... ) As Double

    Dim sum As Double = 0
    Dim i As Integer

    Dim args As cva_list '' argument list object
    cva_start( args, count ) '' constructor
    For i = 1 To count
        sum += cva_arg(args, Double)
    Next
    cva_end( args ) '' destructor
   
    Return sum / count
End Function

Print average(4, 3.4 ,5.0, 3.2, 4.1) '' all passed variable arguments must be of type double
Print average(2, 65.2, 454.65481)    '' all passed variable arguments must be of type double

end GeSHi

输出如下:

 3.925
 259.927405

start GeSHi

vb
'' pass the args list to a function taking an cva_list type argument
#include "crt/stdio.bi"

Sub myprintf CDecl( fmt As ZString Ptr, ... )
    Dim args As cva_list
    cva_start( args, fmt )
    vprintf( fmt, args )
    cva_end( args )
End Sub

Dim As String s = "bar"

myprintf( !"integer=%i, longint=%lli float=%f\n", _
    1, 1ll Shl 32, 3.3 )

myprintf( !"string=%s, string=%s\n", "foo", s )

end GeSHi

版本

  • 自 fbc 1.07.0 起支持

平台差异

  • cva_list 的确切类型和大小取决于 -target-arch-gen 命令行选项。
  • -gen gas 中,cva_list 是一个指针
  • -gen gcc 中,cva_list 是指针、结构体或结构体数组。cva_list 类型在 gcc 中被替换为 "__builtin_va_list"
  • 在 32 位目标,gas 后端:type cva_list as any alias "char" ptr
  • 在 32 位目标,gcc 后端:type cva_list as any alias "__builtin_va_list" ptr
  • 在 Windows 64 位,gcc 后端:type cva_list as any alias "__builtin_va_list" ptr
  • 在 Linux x86_64,gcc 后端:type cva_list as __va_list_tag alias "__builtin_va_list[]"
  • 在 arm64,gcc 后端:type cva_list as __va_list alias "__builtin_va_list"

方言差异

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

与 QB 的差异

  • FreeBASIC 新增特性

另请参阅

返回 目录

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