va_start
2つの関数で連続して呼び出すときに問題が発生することに気づきました。基本的な例は次のとおりです。
std::string format(std::string fmt, ...)
{
char buf[2000];
va_list aq;
va_start(aq, fmt);
vsprintf(buf, fmt.c_str(), aq);
va_end(aq);
return std::string(buf);
}
void error(std::string fmt, ...)
{
va_list ap;
va_start(ap, fmt);
printf("%s", format(fmt, ap).c_str());
va_end(ap);
exit(1);
}
int main()
{
int x = 10;
printf("%s", format("Test %d\n", x).c_str());
error("Test %d\n", x);
}
を生成します
Test 10
Test -1078340156
関数を使用するとerror
、引数が破損しているようです。
va_list
を別の関数に渡す正しい方法は何でしょうか?