可変引数リストの、最初の引数へのポインタを返します。
構文:
pointer_variable = va_first()
記述:
va_first 関数は、関数に渡された最初の変数の引数を指す、タイプされていない
pointer 値を、提供します。
-gen gcc を使う場合はサポートされません。 プラットフォーム間の互換性のために、
cva_list 可変個数引数リスト形式を使います。
例:
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) '' 渡す変数の引数は、すべて double 型でなければなりません
Print average(2, 65.2,454.65481) '' 渡す変数の引数は、すべて double 型でなければなりません
Sleep
出力は、下のようになるでしょう:
'' 単純なカスタム 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
'' Is it a format char?
If (char = Asc("%")) Then
If (todo = 0) Then
'' % at the end
Print "%";
Exit While
End If
'' 次の文字は型を伝えます
char = *p
p += 1
todo -= 1
'' var-arg を表示。型に従って
Select Case char
'' integer?
Case Asc("i")
Print Str(va_arg(arg, Integer));
'' 注意、 C との違い: va_next() を使わなければなりません。
'' va_arg() は、ポインターを更新しないからです。
arg = va_next(arg, Integer)
'' long integer? (64-bit)
Case Asc("l")
Print Str(va_arg(arg, LongInt));
arg = va_next(arg, LongInt)
'' single or double?
'' Note: because the C ABI, var-args に渡されたシングルは、
'' 全てダブルに変換されます。
Case Asc( "f" ), Asc( "d" )
Print Str(va_arg(arg, Double));
arg = va_next(arg, Double)
'' string?
Case Asc("s")
'' 文字列は byval で渡されます。したがって、長さは未知です。
Print *va_arg(arg, ZString Ptr);
arg = va_next(arg, ZString Ptr)
End Select
'' Ordinary char, just print as-is
Else
Print Chr( char );
End If
Wend
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)
Sleep
方言差:
-
-lang qb 方言では、別名 __Va_first で参照をつけない場合、利用できません。
QBからの違い:
参照: