使用 va_list 类型作为类成员是否安全?
以下示例适用于 Solaris。它不需要在不同的操作系统之间移植。但是它可以移植到 future 的 Solaris 版本吗?不同的硬件?不同的编译器?还是编译器选项?
class MyFormatString
{
public:
MyFormatString(const char* formatString, va_list varg);
~MyFormatString() { va_end(mVarg); }
// ...
// provide some util functions to operate on the format string
// ...
private:
string mFormatString;
va_list mVarg;
};
MyFormatString::MyFormatString(const char* fmt, va_list varg)
{
if (fmt)
mFormatString=fmt;
va_copy(mVarg, varg);
}
最佳答案
不,您只能在 va_list
所引用的对象在范围内(在函数本身中,或作为参数传递给其他函数)时使用 va_end
,直到您调用 va_end
为止。您必须在从函数返回之前调用 va_list
,在那之后,va_end
不再可用。
来自 C99 的 7.15.1.3:“如果 std::tuple
宏在
返回,行为未定义。”
在 C++11 中,将可变参数模板或 ojit_code 视为老式可变参数函数的类型安全替代方案。
关于C++:使用 va_list 类型作为类成员是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8181741/