va_listの使い方

va_listというものがある。これを使うとprintfのような、いくつでも値を関数呼び出しの括弧の中に入れられるような関数が作れる。

int CheckWhichEver(int maxnum,int val,...) {
	va_list ap;
	va_start(ap,val);
	for (int i=0;i<maxnum;i++) {
		if (val==va_arg(ap,int)) {
			va_end(ap);
			return 1;
		}
	}
	va_end(ap);
	return 0;
}

上のサンプルコードは、valの値とそれ以降の値が一つでも合っていたら1を返すものである。va_startで初期位置-1を宣言した後、以降va_argを呼び出すごとに一つずつ進んでいく。
欠点はvalの上にいったい幾つ値があるのか分からないので、予めmaxnum等で指定してあげなければいけない。ぶっちゃけ使いづらいのでコンテナでも渡した方がいい気もする。

sprintfみたいなことをしたい場合は以下の通り。

void tERROR(const char *inputMsg,...) {
	int len;
	char buf[128];
	va_list ap;
	va_start(ap,inputMsg);
	len = vsprintf_s(buf,128,inputMsg,ap);
	va_end(ap);
	if(len!=EOF) {
		// なんとかかんとか
	}
}

こっちは割と使い道があったりする。例えば番号付きのファイルを開く時や、ヘルプの表示等。まあsprintfを使っても良いのだが。