可変長引数

可変長引数（かへんちょうひきすう、、）とはプログラミング言語において、関数（サブルーチンやメソッドを含む）やマクロの引数が固定ではなく任意の個数となっている引数のことである。
可変引数、可変個引数とも呼ばれる。
可変長引数を持つ関数を可変長引数関数（）と言う。
いくつかの言語では型安全が保証されなくなるので注意が必要である。
手法.
可変長引数を取る手続きあるいは関数やメソッドは、多くのコンピュータプログラミング言語でサポートされている。
例.
C言語.
C言語においては codice_8、codice_9 といった標準ライブラリの関数が可変長引数をとる代表例である。可変長引数をとる関数のユーザー定義も可能である。信頼できない入力を扱う場合は書式文字列攻撃に注意する必要がある。可変長引数として渡す際に型情報が失われるため、型に関する情報を別途渡すなどする必要がある。
倍精度浮動小数点数の平均値を求める関数codice_10の例を考える。
/* stdarg.h には、マクロ va_start、va_arg、va_end が定義されている。対応する va_start と va_end の呼び出しは、同じ関数内でなければならない。 */
double average_of_doubles(int count, ...) {
 va_list ap;
 double sum = 0;
 int i;
 assert(count > 0);
 va_start(ap, count); /* スタック変数のアドレスを参照するため、最後の引数が必要である。 */
 for (i = 0; i < count; ++i) {
 /* スタックに積まれているはずの double 型の値を取り出し、ポインタ変数 ap が次の引数を指すように変更する。 */
 sum += va_arg(ap, double);
 va_end(ap);
 return sum / count;
上記を呼び出すコード例は次の通りである。データの個数を最初の引数として与えている。
int main(void) {
 double average1 = average_of_doubles(3, 1.0, 2.0, 3.0);
 double average2 = average_of_doubles(4, 1.5, 2.1, -3.0, 0.7);
 printf("%f\n", average1);
 printf("%f\n", average2);
 return 0;
Cの可変長引数には、「既定の実引数拡張」() と呼ばれる暗黙の型変換規則が適用される。例えばcodice_11型の実引数は、codice_12型に拡張される。関数形式マクロcodice_13を使ってスタックから値を取り出す際、指定した型の値が実際には格納されていなかった場合、未定義動作を引き起こす。
上記の例では、可変長引数にcodice_12型の値（または既定の実引数拡張を受けるcodice_11型の値）が渡されることを想定しているが、可変長引数に間違ってcodice_16などの整数型の値を渡してもコンパイルは通ってしまい、未定義動作を引き起こす。この例では同じcodice_12型の1つ以上の値を渡すことができればよいので、可変長引数を使うのではなく、単純にcodice_12の配列を使って型安全に実装すべきである。
double average_of_doubles(const double* values, int count) {
 double sum = 0;
 int i;
 assert(values);
 assert(count > 0);
 for (i = 0; i < count; ++i) {
 sum += values[i];
 return sum / count;
Cプリプロセッサ・マクロ.
C言語のプリプロセッサのマクロ定義において、可変長引数マクロには、以前はトリック的な方法が使われていたが、C99で本物の可変長引数マクロが標準化された。codice_19という識別子を使用する。
次のような関数の呼び出しに展開されるマクロを定義したいとする。関数が可変長引数をとるため、機能を制限したくなければ、マクロも可変長引数をとるようにしたい。
void realdbgprintf(const char *sourceFilename, int sourceLineNumber, const char *formatString, ...);
C++での可変長引数マクロの設計に問題があるため、以下に示すような定義は行えない。
この書き方だと、codice_20と記述した際にcodice_21と展開される。関数の引数リストをコンマで終えると構文エラーを起こすため、printfのような使い勝手は得られない。
gccの独自構文ではcodice_22という識別子もサポートしている。これを利用することにより引数がゼロ個のものも定義できる。
gcc以外でも使用するためにはcodice_19を使うほかないが、その場合は書式文字列も含めて可変長引数として渡す必要がある。
Microsoft Visual C++の独自拡張モードでは、ゼロ個の引数を受け取るcodice_19は末尾コンマを抑制する動作をする。
C++20では、空の可変引数を処理するためのcodice_25マクロをサポートする。
C++.
可変長引数テンプレートがC++11でサポートされた。
template<typename... Args> class tuple;
このcodice_26クラステンプレートは、テンプレート引数としていくらでも型名を取れる:
tuple<std::vector<int>, std::map<std::string, std::vector<int»> someTuple; // tuple インスタンス。
tuple<> emptyTuple;
codice_27としても標準化されている。
また、C++11ではC99との互換性向上のため、可変長引数マクロが標準化された (N1653)。
Java.
平均値を求める静的メソッド codice_28 の例を考える。平均値の計算には最小でも1個の値が必要であるから、固定個数の仮引数（必須の仮引数）として codice_29 を指定しており、それ以降を任意個数の引数としている。任意個数の値は仮引数 codice_30 に codice_12 型の配列として格納される。
static double average(double x0, double ... xs) {
 double sum = x0;
 int count = 1;
 for (double x: xs) {
 sum += x;
 ++count;
 return sum / count;
上記を呼び出すコード片の例は次の通りである。
System.out.println(average(0.3, 9.4, 5.2, 4.5, 9.7));
Scheme.
平均値を求める手続き codice_28 の例を考える。平均値の計算には最小でも1個の値が必要であるから、固定個数の仮引数（必須の仮引数）として codice_29 を指定しており、それ以降を任意個数の引数としている。任意個数の値は仮引数 codice_30 にリストとして格納される。
 (let ((sum x0) (count 1))
 (for-each
 (lambda (x)
 (set! sum (+ sum x))
 (set! count (+ count 1)))
 xs)
 (/ sum count)))
上記を呼び出すコードの例は次の通りである。
英語.
は「可変長引数の」「可変個引数の」という意味の形容詞である。C言語などでは可変長引数のことを「」と呼ぶ。辞典などでは直訳して「変数引数」とされていることがあるが、これは誤訳である。なお、「変数引数」という言葉は、Pascalなどで変数渡しに使用される「」の定訳であり、これは可変長引数とは違うものを指す。したがって、可変長引数のことを「変数引数」と呼ぶのは混乱の原因となる。