我有ERROR_OUT函数,该函数在内部使用vfprintf在控制台中记录错误。当我试图使用ERROR_OUT(L_NOTICE, "Epoll error: %d", errno);函数记录一些epoll错误时,有时会得到奇怪的输出:

Epoll error: -1079274856

我仅在epoll_waitepoll_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_listargp中。

因此,您实际上将包含va_listva_list传递给vfprintf作为第三个参数,由于%dva_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));
}

10-05 19:52