我在类的构造函数中有此代码(不是我写的),并且将变量arg列表写入tmp文件。
我想知道为什么会需要它?此ctor超出范围后,将删除tmpfile,并且var arg列表位于m_str vector 内。
有人可以建议一种更好的方法而不使用tmpfile吗?
DString(const char *fmt, ...)
{
DLog::Instance()->Log("Inside DString with ellipses");
va_list varptr;
va_start(varptr, fmt);
FILE *f = tmpfile();
if (f != NULL)
{
int n = ::vfprintf(f, fmt, varptr) + 1;
m_str.resize(n + 1);
::vsprintf(&m_str[0], fmt, varptr);
va_end(varptr);
}
else
DLog::Instance()->Log("[ERROR TMPFILE:] Unable to create TmpFile for request!");
}
最佳答案
这是C++代码:我认为您可能正在尝试解决错误的问题。
如果您考虑使用C++风格的设计而不是继续使用varargs,则对临时文件的需求将完全消失。转换所有调用站点以使用新机制可能看起来很多工作,但是varargs提供了多种错误传递参数的可能性,从而使您容易遇到隐患,更不用说不能传递非错误代码了。 POD类型。我相信,从长期(甚至中期)来看,它将在可靠性,清晰度和易于调试方面获得返回。
相反,尝试实现C++样式的流接口(interface),该接口(interface)可提供类型安全性,甚至在需要时甚至可以禁止某些操作。