【发布时间】:2010-07-20 13:21:01
【问题描述】:
我在一个类的构造函数中有这段代码(不是我写的),它将一个变量 arg 列表写入一个 tmp 文件。
我想知道为什么需要这样做?在此 ctor 超出范围并且 var arg 列表位于 m_str 向量内后,将删除 tmpfile。
有人可以建议一种更好的方法来执行此操作而不使用 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!");
}
【问题讨论】:
-
你能不能改变构造函数的原型来避免使用省略号?
-
ereOn:没有原因它会在我的代码库中导致很多错误。
-
如果
m_str是std::string,则将&m_str[0]视为指向数组的指针会产生未定义的行为;不保证存储是连续的。如果是std::vector<char>,那没关系。 -
@Mike:理论上你是对的,但只是理论上。 C++0x 增加了一个要求它是连续的,部分原因是似乎没有人知道不连续的实现。
-
有时修复已知的编译错误(从转换为更好的界面)现在比花费数天时间调试为什么 varargs 参数在一种情况下无法正常工作所花费的时间要少得多。
标签: c++ variadic-functions temporary-files