最終更新日時:
が更新

履歴 編集

macro
<cstdarg>

va_copy(C++11)

#define va_copy(dest, src) unspecified

概要

va_listオブジェクトsrcの現在の状態を、destに複製する。

複製したdestは、srcと同じ位置から独立してva_argで引数をたどれる。

効果

destを、va_startsrcを初期化してからsrcに対して行われたのと同じ回数のva_arg呼び出しを適用した状態に初期化する。

戻り値

なし

備考

  • va_copyで初期化したdestも、使用後は対応するva_endで後始末しなければならない。

#include <cstdarg>
#include <iostream>

// 可変引数を2回走査する(合計と、複製した情報を使った最大値)
void print_sum_and_max(int count, ...)
{
  std::va_list args;
  va_start(args, count);

  // argsを複製して独立に走査する
  std::va_list args_copy;
  va_copy(args_copy, args);

  int total = 0;
  for (int i = 0; i < count; ++i) {
    total += va_arg(args, int);
  }
  va_end(args);

  int max = va_arg(args_copy, int);
  for (int i = 1; i < count; ++i) {
    int v = va_arg(args_copy, int);
    if (v > max) max = v;
  }
  va_end(args_copy);

  std::cout << "sum=" << total << ", max=" << max << std::endl;
}

int main()
{
  print_sum_and_max(3, 10, 30, 20);
}

出力

sum=60, max=30

バージョン

言語

  • C++11

関連項目

  • va_start: 可変引数へのアクセスを開始する
  • va_arg: 次の可変引数を取得する
  • va_end: 可変引数へのアクセスを終了する