8

我的代码包含如下片段:

    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 保护实例?

4

2 回答 2

10

很不幸的是,不行。规范va_startva_end要求:

va_start和宏的每次调用va_copy都应与同一函数中va_end相应的宏调用相匹配。

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

于 2012-08-27T12:46:43.480 回答
0

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

最好用一个类来包装这个函数。

于 2012-08-27T12:46:29.763 回答