[C++] 157 va_listの機能調査

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

“[C++] 155 TCP/IP HTTPプロトコル”にあるSOCprintf関数の挙動を調べ、va_listの機能を把握しました。かなり特徴的な文法に思えます。

vsprintfとvfprintfは初見でした。

int SOCprintf(int num, ...)
{
	va_list args;
	int	soc;
	char *fmt;
	char buf[4096];

	// numは...内の個数
	va_start(args, num);

	// int型の引数を取得
	soc = va_arg(args, int);
	// char*型の引数を取得
	fmt = va_arg(args, char *);

	cout << "soc " << soc << endl;
	cout << "fmt " << fmt << endl;

	// 引数をformat変換しbufに格納
	vsprintf(buf, fmt, args);
	cout << "buf " << buf << endl;
	cout << "vsprintf pass" << endl;

	// format変換した引数を標準出力
	vfprintf(stdout, fmt, args);
	// vfprintf(stderr,fmt,args); // 旧コード
	cout << "vfprintf pass" << endl;

	// 引数のリストをクリア
	va_end(args);

	// リクエスト送信(socはソケット記述子の整数)
	send(soc, buf, strlen(buf), 0);

	return 0;
}