预期 'void (**)(void *, const char *)' 但参数类型为 'void (*)(void *, const char *)

expected 'void (**)(void *, const char *)' but argument is of type 'void (*)(void *, const char *)

我想不通

void (**)(void *, const char *)
/*    ^^ why are there 2 asterisks here?

意思是,它是一个指向函数的指针,但我没能

确切的错误信息是

expected 'void (**)(void *, const char *)' but argument is of type 'void (*)(void *, const char *)'      
       initGenericErrorDefaultFunc (xmlGenericErrorFunc *handler);      
       ^
/usr/include/libxml2/libxml/xmlerror.h:866:

这是libxml2中的默认错误消息函数,我尝试调用的函数是

initGenericErrorDefaultFunc (xmlGenericErrorFunc *handler);

我的handler参数函数是

void
skipErrorPrinting(void *ctx, const char *msg, ...)
{
}

然后我这样调用initGenericErrorDefaultFunc()

initGenericErrorDefaultFunc(skipErrorPrinting);

这里是xmlGenericErrorFunc

的定义
typedef void (XMLCDECL *xmlGenericErrorFunc) (void *ctx,
                 const char *msg,
                 ...) LIBXML_ATTR_FORMAT(2,3);

它很不稳定,它想要 return 默认错误处理程序。所以你必须传递一个指向变量的指针。像这样(未经测试):

xmlGenericErrorFunc handler;
initGenericErrorDefaultFunc(&handler);

如果我正确理解了您的意图,这并不是您真正想要用来抑制错误的功能。请改用 xmlSetGenericErrorFunc()。您可以使用 initGenericErrorDefaultFunc() 再次恢复它。传递 NULL。

您使用xmlGenericErrorFunc *handler。注意星号。 xmlGenericErrorFunc 已经用一个定义了类型。把xmlGenericErrorFunc后面的星号去掉就可以了,已经是指针了