使用 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/

10-11 16:50