1 打印乱码现象:
[Mon Nov 15 10:59:51 2021] Failed to create http session, 192.168.1.1 tmp 榜?tmp2 192.168.1.3 tmp3 榜?ip H塃鳫婨鳫?111
va_start(ap, fmt); //xxx_sprintf(buff_log, fmt, ap); //改成这句打印乱码 xxx_vsprintf(buff_log, fmt, ap, true); //改成这句后打印正确 va_end(ap);
2 错误原因:
xxx_sprintf(buff_log, fmt, ap);
已经包含了va_start
template int xxx_sprintf(std::basic_string& s, const T* fmt, …) { va_list ap; va_start(ap, fmt); const int rc = string_vsprintf(s, fmt, ap); va_end(ap); return rc; }
2.在C中实现变量参数访问的方式使得很明显va_list对象存储了一些内部状态。这使得它不可重入,这意味着在va_list对象上调用va_start将使前一个va_start的效果无效。但更准确地说,C在使用va_end“关闭”先前调用的va_start会话之前,明确禁止在va_list对象上再次调用va_start。va_list对象应该以“非重叠”方式使用:va_start…va_end。之后,您可以在同一个va_list对象上执行另一个va_start。但是尝试在同一个va_list对象上重叠va_start…va_end会话将不起作用。应参考以下,使用va_copy()
int xxx_vsprintf(std::basic_string& s, const T* fmt, va_list args, bool append)
{
va_list ap;
va_copy(ap, args);
int len = ACE_OS::vsnprintf(&s[0] + pos, size, fmt, ap);
va_end(ap);
}
文章评论
11