可変引数リスト・オブジェクト型
構文:
内容:
cva_list は、可変個の手続きで、可変長引数リストを操作するための、組み込みデータ型です。
cva_start を使って、
cva_list 変数(構築子)を初期化します。
cva_copy を使って、
cva_list 変数をコピーします(コピー構築子)。
cva_arg を使って、次の引数の値を取得します。
cva_list 変数(デストラクタ)で終了したら、
cva_end を使います。
cva_list の正確な型とサイズは、ターゲット・プラットフォームによって異なります。
この組み込み型は、可変個の手続きに渡される値を取得するための、基礎となるメカニズムを抽象化する層を提供します。
fbc は、次のコードで説明するように、
-target,
-arch,
-gen コマンドライン・オプションに応じて、デフォルトの
cva_list 型を選択します。
#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
例:
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
出力は次のようになります:
'' 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 )
プラットフォームの違い:
- cva_list の正確な型とサイズは、-target, -arch, -gen コマンドライン・オプションに依存します。
- -gen gas では cva_list はポインターです。
- -gen gcc では、cva_list はポインターか、構造体か、構造体配列です。
cva_list 型は、gcc の "__builtin_va_list" に置き換えられます。
- 32-ビットターゲットでは、gas backend: type cva_list as any alias "char" ptr
- 32-ビットターゲットでは、gcc backend: type cva_list as any alias "__builtin_va_list" ptr
- Windows 64-bit では、gcc backend: type cva_list as any alias "__builtin_va_list" ptr
-
Linux x86_64 では、gcc backend: type cva_list as __va_list_tag alias "__builtin_va_list[]"
- arm64 では、gcc backend: type cva_list as __va_list alias "__builtin_va_list"
バージョン:
方言差:
- -lang qb 方言では、別名 __cva_list で参照されない限り、使えません。
QBからの違い:
参照: