我在类的构造函数中有此代码(不是我写的),并且将变量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)可提供类型安全性,甚至在需要时甚至可以禁止某些操作。

10-04 20:58