CVA_LIST
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgCvaList
- 最后更新: 2021-10-11
可变参数列表对象类型
语法
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
#endifend 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 doubleend GeSHi
输出如下:
3.925
259.927405start 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 新增特性
另请参阅
- ... (Ellipsis)
cva_argcva_startcva_copycva_end
返回 目录