関数の引数リストの末尾に ... を書いて、可変長引数を受け取る方法。
<cstdarg> によるアクセス
<cstdarg> で提供される機能を使うと、可変長引数をたどれる。
va_start で引数をたどるには、最後の非 ... 引数が必要になる。
va_list可変長引数にアクセスするための型va_start(list, 最後の非 ... 引数)va_listを初期化するマクロva_arg(list, 型)次の引数を取り出すva_end(list)後始末を行う
可変長引数は次の危険性があるため、あまり利用は推奨されない:
- コンパイラが型を検証できず、型の誤りに関する警告を出せない
- 引数の個数や型について、呼び出し側と受け取り側で別途規約を共有する必要がある
例
#include <cstdarg>
#include <iostream>
double findAverage(int count, ...)
{
int sum{ 0 };
va_list list;
va_start(list, count);
for (int arg{ 0 }; arg < count; ++arg)
{
sum += va_arg(list, int);
}
va_end(list);
return static_cast<double>(sum) / count;
}
int main()
{
std::cout << findAverage(5, 1, 2, 3, 4, 5) << '\n';
std::cout << findAverage(6, 1, 2, 3, 4, 5, 6) << '\n';
}