c++ - var arg list to tempfile,为什么需要它?

标签 c++ variadic-functions temporary-files

我在一个类的构造函数中有这段代码(不是我写的),它将一个变量 arg 列表写入一个 tmp 文件。

我想知道为什么需要这个?在这个 ctor 超出范围并且 var arg 列表位于 m_str vector 内后,tmpfile 被删除。

有人可以建议一种不使用 tmp 文件的更好方法吗?

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++ 风格的设计而不是继续使用可变参数,那么对临时文件的需求将完全消失。将所有调用站点转换为使用新机制似乎需要做很多工作,但可变参数提供了多种可能性来错误传递参数,使您容易受到潜在错误的影响,更不用说您不能传递非- POD 类型。我相信从长期(甚至中期)来看,它将在可靠性、清晰度和易于调试方面得到返回。

而是尝试实现一个 C++ 风格的流接口(interface),该接口(interface)提供类型安全性,甚至能够在需要时禁止某些操作。

关于c++ - var arg list to tempfile,为什么需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3290332/

相关文章:

C++ 非类型参数包扩展

c# - C# 中的 `params` 是否总是会导致在每次调用时分配一个新数组?

.net - 如何以编程方式获取 ASP.NET 临时目录?

python - 如何使用 python 在 google app engine blobstore 上创建一个简单的虚拟文件系统?

c++ - Cpp 中的构造函数和变量声明

c++ - 清除 ptr_array

java - 将 "String*"(Scala) 转换为/自 "String..."(Java)

.net - .Net 中的临时文件

c++ - literal double 到 float 的转换是否等于 float literal?

c++ - 如何加快在 OpenGL 中绘制纹理的速度? (3.3+/4.1)