FreeBASIC マニュアルのトップに戻る

FreeBASIC CVA_LIST

目次→命令文→手続きCVA_LIST←オリジナル・サイト

CVA_LIST 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

可変引数リスト・オブジェクト型

構文:
dim variable as cva_list

内容:
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


出力は次のようになります:
 3.925
 259.927405


'' 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 )


プラットフォームの違い:
バージョン:
方言差:
QBからの違い:
参照:
手続きに戻る
変数引数一覧に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2021-10-11 09:33:27
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall

ホームページのトップに戻る

表示-非営利-継承