#define va_start(ap, parmN) unspecified // (1) C++03
#define va_start(ap, ...) unspecified // (1) C++26
概要
可変引数へのアクセスを開始し、va_listオブジェクトapを初期化する。
apを初期化した後は、va_argマクロで各引数を順に取り出せる。使用後は、同じapに対してva_endマクロを呼び出さなければならない。
- C++03 : 第2引数
parmNには、可変引数(...)の直前にある関数の仮引数を指定する。 - C++26 : 可変引数マクロとなり、
ap以降の引数(...)は破棄される。歴史的経緯から第2引数を受け付けるが、その値は使用されない。
効果
apを、関数に渡された可変引数にアクセスできる状態に初期化する。
戻り値
なし
備考
- 同じ関数内で、
va_startで初期化したapは、対応するva_endで後始末しなければならない。 - C++26では、第2引数以降のいずれかが不均衡なカッコを含む、またはトークンに変換されない前処理トークンに展開される場合、プログラムは不適格となる(診断は要求されない)。
例
#include <cstdarg>
#include <iostream>
// count個のint引数の合計を求める
int sum(int count, ...)
{
std::va_list args;
va_start(args, count);
int total = 0;
for (int i = 0; i < count; ++i) {
total += va_arg(args, int);
}
va_end(args);
return total;
}
int main()
{
std::cout << sum(3, 10, 20, 30) << std::endl;
}
出力
60
バージョン
言語
- C++03
関連項目
参照
- P3348R4 C++26 should refer to C23 not C17
- C++26でC23を参照するようになり、
va_startが可変引数マクロva_start(ap, ...)となった
- C++26でC23を参照するようになり、
- LWG Issue 4388. Align new definition of
va_startwith C23