·

風邪(2) / 書式文字列 / C Magazine 2005年8月号 / Software Design 2005年8月

風邪(2)

濡れタオルのおかげか熱は大分下がったみたい。頭痛も少し残ってるけど出勤できるくらい。

書式文字列

或曰:2001年9月中旬

の、フォーマット文字列と可変長引数を受け取って文字列を生成するprintfみたいな関数を参考にログ出力関数を作った。参考にしたソースはこれ。

void
dprintf(char *format, ...)
{				/* } */
	va_list vl;
	char putbuf[1024];
	DWORD err;

	err = GetLastError();
	{
		va_start(vl, format);
		vsprintf(putbuf, format, vl);
		va_end(vl);
		OutputDebugString(putbuf);
	}
	SetLastError(err);
}

vsprintfは_vsnprintfに書き換えた。ただ、これだとバッファサイズが固定なのでちょっと困る。

で、MFCのCString::Formatがどう実装されているのか気になった。おそらく内部的には_vsnprintfに類する関数をコールしていると思われるが、バッファは大きめに固定でとっているのだろうか。

CString::Formatのソース(MFC/SRC/STREX.CPP)を見てみた。というか実際にはCString::Formatから呼ばれるCString::FormatVが本体。見てみると、バッファサイズは書式文字列をパースして生成後の文字列長を算出してバッファサイズを決定しているらしいということがわかった。

C Magazine 2005年8月号

毎月のことなので、特に何が読みたいということなく購入。

Software Design 2005年8月

「緊急レポート!最新ソフトウェア開発手法事情」が読みたくて久しぶりに購入。