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

时间:2015-02-09 19:38:10

标签: c function-pointers libxml2

我无法弄明白

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);

2 个答案:

答案 0 :(得分:4)

它非常不稳定,它希望返回默认的错误处理程序。所以你必须将指针传递给变量。像这样(未经测试):

xmlGenericErrorFunc handler;
initGenericErrorDefaultFunc(&handler);

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

答案 1 :(得分:0)

您使用xmlGenericErrorFunc *handler。注意星号。 xmlGenericErrorFunc已经使用一个进行了类型定义。只需在xmlGenericErrorFunc之后删除星号,它就已经是一个指针。