最終更新日時:
が更新

履歴 編集

macro
<cstdarg>

va_start

#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

関連項目

  • va_arg: 次の可変引数を取得する
  • va_end: 可変引数へのアクセスを終了する
  • va_copy: va_listオブジェクトを複製する

参照