C++ SBRM/RAII用于std::va_列表/va_开始()/va_最终用途

C++ SBRM/RAII用于std::va_列表/va_开始()/va_最终用途,c++,raii,variadic-functions,C++,Raii,Variadic Functions,我的代码包含如下代码段: std::va_list ap; va_start(ap, msgfmt); snprintf_buf buf; const tchar * msg = buf.print_va_list(msgfmt, ap); va_end(ap); 它们很短,va_start()和va_end()靠得很近,所以问题不大。两者之间的调用异常可能是一个问题(或者不是?) 简单测试表明,不允许从没有省略号的函数调用va_start()。从不同的

我的代码包含如下代码段:

    std::va_list ap;
    va_start(ap, msgfmt);
    snprintf_buf buf;
    const tchar * msg = buf.print_va_list(msgfmt, ap);
    va_end(ap);
它们很短,
va_start()
va_end()
靠得很近,所以问题不大。两者之间的调用异常可能是一个问题(或者不是?)

简单测试表明,不允许从没有省略号的函数调用
va_start()
。从不同的函数调用
va\u end()
是否允许


基本上,我很好奇这些调用是否可以使用SBRM/RAII习惯用法,即使需要手动调用
va_start()
,然后将
std::va_list
的实例传递到我的RAII/SBRM guard实例中?

一个可能的实现假设std::va_list=char*和va_end()只是将指针设置为null。当然,它可以在函数之外调用。但我不确定它是否能在其他平台上运行


最好用类来包装此函数。

不幸的是,没有。
va\u start
va\u end
的规范要求:

每次调用
va_start
va_copy
宏 应通过相应的调用
va_end
来匹配 功能


因此,
va_end
必须位于可变函数本身,而不是类析构函数。

@wilx:C99标准,7.15.1/1。