SBRM / RAII用于std :: va_list / va_start()/ va_end使用

时间:2012-08-27 12:14:30

标签: 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()。是否从允许或不允许调用va_end()以外的函数调用va_start()

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

2 个答案:

答案 0 :(得分:7)

不幸的是,没有。 va_startva_end的规范要求:

  

每次调用va_startva_copy宏   应匹配相同的va_end的相应调用   功能

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

答案 1 :(得分:0)

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

最好用类包装这个函数。