[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;
}