2005-11 / 2005-11-04

前のエントリ: printfのフォーマットで桁数を変数指定 [c]
次のエントリ: 今日の戦利品 [ぬいぐるみ]

可変長引数
2005-11-04-2 / カテゴリ: [programming][c] / [permlink]

めも

各変数を自前で取り出して使う場合
#include <stdarg.h>
/* 引数を全部足して返す */
int sumall(int n, ...) {
  va_list ap;
  int total = n;
  int n_tmp = 0;

  va_start(ap, n);   /* 最後の固定変数を指定し,最初の可変長引数をセットする */
  while ((n_tmp = va_arg(ap, int)) != 0) {
    total += n_tmp;  /* 型を指定することで引数を一つ取り出す.
                        ap には次の引数がセット */
  }
  va_end(ap);        /* 後始末 */

  return total;
}
というわけで,va_xxx には「引数の最後」が何かを知る術はないようなので,固定引数部分に引数の個数を入れるか,番兵を使うかするっぽい.(上のコードは 0 があったら終了する)
また,型情報が必要なので,複数の型を扱うときは工夫が必要.

printf(3) 関係のラッパ
#include <stdarg.h>
void error(char *fmt, ...) {
  va_list ap;

  fprintf(stderr, "%s", "Error! ");
  va_start(ap, fmt);
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  exit(1);
}
vprintf(3) や vfprintf(3) には,ap を渡せば期待する動作になるかと.
前のエントリ: printfのフォーマットで桁数を変数指定 [c]
次のエントリ: 今日の戦利品 [ぬいぐるみ]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12