我的代码包含以下代码段:
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守卫实例?
答案 0 :(得分:7)
不幸的是,没有。 va_start
和va_end
的规范要求:
每次调用
va_start
和va_copy
宏 应匹配相同的va_end
宏的相应调用 功能强>
因此,va_end
必须位于可变参数函数本身,而不是类析构函数。
答案 1 :(得分:0)
其中一个可能的实现假设std :: va_list = char *,而va_end()只是将该指针设置为null。当然,它可以在函数之外调用。但我不确定它在其他平台上是否会起作用。
最好用类包装这个函数。