引数の可変数を渡すために、手続きパラメーターの代わりに使われます。
あるいは、配列宣言で、要素の数が initializer によって決定される場合の、配列要素数の上限として、使われます。
構文:
記述:
可変個変数手続き
省略記号(3つの点、
...)は、手続きの宣言と定義で、可変個の引数リストを示すために、使われます。
(少なくとも)最初の引数は必ず指定する必要があり、手続きは C 呼び出し規約
cdecl を使って呼び出す必要があります。
手続き本体では、
cva_list データ型と
cva_arg マクロを使って、省略記号パラメータ(
...)を展開し、可変個引数手続きに渡される引数の値を取得できます。
引数リストは、
cva_start で初期化されるか、
cva_copyでコピーされると、
cva_list パラメーターを使って別の手続きに渡すことができます。
一部のターゲットでは、下位互換性のために、引き続き
va_first,
va_arg および
va_next を使って変数引数を処理できます。
変数引数としてサポートされているのは数値型とポインターだけです(変数引数に渡されるすべての byte と short は、暗黙で integer に変換され、変数引数に渡されるすべてのシングルは暗黙で double に変換されます)。
String を渡すことができます。その場合、文字列データへの
Zstring Ptr が取得されます。
可変個引数手続き名は、多重定義できません。
可変個マクロ
省略記号を
#define か
#macro 宣言の最後のパラメーターの後ろに使うと、可変個引数マクロを作成できます。
これは、
variadic_parameter に任意の数の引数を渡すことができることを意味します。
任意の数の引数は、通常のマクロパラメーターであるかのように
本体 で使用できます。
variadic_parameter は、コンマを含む、渡された引数の完全なリストに展開されます。完全に空にすることもできます。
注意: variadic_parameter によって渡されるさまざまな引数を区別するには、最初に
演算子 # (Preprocessor Stringize) を使って
variadic_parameter を文字列に変換し、次にこの文字列(
#variadic_parameter)で、区切り文字(通常はコンマ)を見つけて渡される各引数を区別します。
配列の上限
配列宣言の上限の代わりに省略記号を使うと、
expression_list に表示されるデータに従って上限が設定されます。
省略記号をこのように使う場合、初期化子を表示する必要があり、
Any にすることはできません。
例:
Declare Function foo cdecl (x As Integer, ...) As Integer
Dim As Integer myarray(0 To ...) = {0, 1, 2, 3}
Print LBound(myarray), UBound(myarray) '' 0, 3
'' 可変個引数の関数を包むために、可変個引数のマクロを使う
#include "crt.bi"
#define eprintf(Format, args...) fprintf(stderr, Format, args)
eprintf(!"Hello from printf: %i %s %i\n", 5, "test", 123)
'' LISP-風のアクセサーで、コンマ区切りのリストを修正できるようにします
#define car(a, b...) a
#define cdr(a, b...) b
QBからの違い:
参照: