次のエントリ: 今日の戦利品 [ぬいぐるみ]
可変長引数
2005-11-04-2 / カテゴリ: [programming][c] / [permlink]
めも
各変数を自前で取り出して使う場合
また,型情報が必要なので,複数の型を扱うときは工夫が必要.
printf(3) 関係のラッパ
各変数を自前で取り出して使う場合
#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 を渡せば期待する動作になるかと.[
コメント ]
次のエントリ: 今日の戦利品 [ぬいぐるみ]
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
