C++:使用va_list类型作为类成员是否安全?

eno*_*mem 3 c++ variadic-functions

使用va_list类型作为类成员是否安全?

以下示例适用于Solaris.它不需要可以跨不同的操作系统移植.但是它可以移植到未来的Solaris版本吗?不同的HW?不同的编译器?还是编译选项?

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);
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 6

不,您只能使用va_list它所引用的对象在范围内(在函数本身中,或作为参数传递给其他函数),直到您调用的点va_end.您必须va_end在从函数返回之前调用,在此之后,它va_list不再可用.

从C99,7.15.1.3开始:"如果va_end在返回之前未调用宏,则行为未定义."

在C++ 11中,考虑可变参数模板或std::tuple作为旧式可变参数函数的类型安全替代方法.