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。