CVA_ARG
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgCvaArg
- 最后更新: 2021-10-11
从可变参数列表对象中获取下一个参数的宏。
语法
variable = cva_arg ( argument_list, datatype )参数
argument_list
用于访问下一个值的 cva_list 数据类型变量
datatype
可变参数列表 argument_list 中下一个值的数据类型
说明
cva_arg 宏允许在函数中使用可变数量的参数:
cva_arg返回列表argument_list中当前参数,预期数据类型为datatype。- 首次使用
cva_arg之前,必须使用命令cva_start或cva_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_copycva_endcva_listcva_start
返回 目录