我有ERROR_OUT函数,该函数在内部使用vfprintf在控制台中记录错误。当我试图使用ERROR_OUT(L_NOTICE, "Epoll error: %d", errno);
函数记录一些epoll错误时,有时会得到奇怪的输出:
Epoll error: -1079274856
我仅在
epoll_wait
和epoll_ctl
之后使用它,并且仅在返回值为负的情况下才调用它。ERROR_OUT的代码:
void ERROR_OUT(int level, char *template, ...){
va_list ap;
va_start(ap, template);
if ( level <= verbosity ){
if (output_handler == NULL){
vfprintf(stderr, template, ap);
}else{
(*output_handler)(level, template, ap);
}
}
va_end(ap);
}
输出处理程序代码:
void log_both(int level, const char *fmt, ...){
va_list argp;
va_start(argp, fmt);
vfprintf(stderr, fmt, argp);
printf("\n");
if (globalArgs.db_verbosity >= level)
globalArgs.db_log->log_error(format(fmt, argp));
va_end(argp);
}
最佳答案
您可以通过va_list
在对log_both
的调用中传递*output_handler
,并将该va_list
包装在名为va_list
的argp
中。
因此,您实际上将包含va_list
的va_list
传递给vfprintf
作为第三个参数,由于%d
是va_list
中的第一个元素,因此期望十进制数。
因此,它应该是void log_both(int level, const char *fmt, va_list argp){}
,并且从函数主体中删除了va_list argp;
,va_start(argp, fmt);
和va_end(argp);
。
void log_both(int level, const char *fmt, va_list argp){
vfprintf(stderr, fmt, argp);
printf("\n");
if (globalArgs.db_verbosity >= level)
globalArgs.db_log->log_error(format(fmt, argp));
}