可変長引数可変長引数(かへんちょうひきすう、英: variable length arguments、variadic arguments)とはプログラミング言語において、関数(サブルーチンやメソッドを含む)やマクロの引数が固定ではなく任意の個数となっている引数のことである。 可変引数、可変個引数とも呼ばれる。 可変長引数を持つ関数を可変長引数関数(英: variadic function)と言う。 いくつかの言語では型安全が保証されなくなるので注意が必要である。 手法可変長引数を取る手続きあるいは関数やメソッドは、多くのコンピュータプログラミング言語でサポートされている。
例C言語C言語においては 倍精度浮動小数点数の平均値を求める関数 #include <assert.h>
#include <stdarg.h>
/* 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;
}
上記を呼び出すコード例は次の通りである。データの個数を最初の引数として与えている。 #include <stdio.h>
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の可変長引数には、「既定の実引数拡張」(default argument promotion) と呼ばれる暗黙の型変換規則が適用される[注釈 1][注釈 2]。例えば 上記の例では、可変長引数に 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言語のプリプロセッサのマクロ定義において、可変長引数マクロ[1]には、以前はトリック的な方法[2]が使われていたが、C99で本物の可変長引数マクロが標準化された。 次のような関数の呼び出しに展開されるマクロを定義したいとする。関数が可変長引数をとるため、機能を制限したくなければ、マクロも可変長引数をとるようにしたい。 void realdbgprintf(const char *sourceFilename, int sourceLineNumber, const char *formatString, ...);
C++での可変長引数マクロの設計に問題があるため[要説明]、以下に示すような定義は行えない。 #define dbgprintf(cformat, ...) realdbgprintf(__FILE__, __LINE__, cformat, __VA_ARGS__)
この書き方だと、 gccの独自構文では #define dbgprintf(cformat, ...) realdbgprintf(__FILE__, __LINE__, cformat, ##__VA_ARGS__)
gcc以外でも使用するためには #define dbgprintf(...) realdbgprintf(__FILE__, __LINE__, __VA_ARGS__)
Microsoft Visual C++の独自拡張モードでは、ゼロ個の引数を受け取る C++20では、空の可変引数を処理するための C++→詳細は「C++11 § 可変長引数テンプレート」を参照
template<typename... Args> class tuple;
この tuple<std::vector<int>, std::map<std::string, std::vector<int>>> someTuple; // tuple インスタンス。
tuple<> emptyTuple;
また、C++11ではC99との互換性向上のため、可変長引数マクロが標準化された (N1653)。 Java平均値を求める静的メソッド 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平均値を求める手続き (define (average x . xs)
(/ (apply + x xs) (+ 1 (length xs))))
上記を呼び出すコードの例は次の通りである。 (average 0.3 9.4 5.2 4.5 9.7)
→ 5.82
英語variadicは「可変長引数の」「可変個引数の」という意味の形容詞である。C言語などでは可変長引数のことを「variable argument」と呼ぶ。辞典などでは直訳して「変数引数」とされていることがあるが、これは誤訳である。なお、「変数引数」という言葉は、Pascalなどで変数渡しに使用される「variable parameter」の定訳であり、これは可変長引数とは違うものを指す。したがって、可変長引数のことを「変数引数」と呼ぶのは混乱の原因となる。 脚注注釈出典
関連項目 |
Portal di Ensiklopedia Dunia