我对指针和函数指针有点熟悉,但这很令人困惑。我有一个函数,这是它的函数头;
void report(List*, bool check(Item*, void*), void*);
实际函数的实现与头文件中的原型相同。主要原型是:bool check(Item*, void*);
。基本上,这只是根据check
的返回值从列表中报告事物。在main.c
中调用函数时,我使用report(list, check(item, specificArg), arg);
我使用void指针的唯一原因是因为arg
/ specificArg
可能是我想要的基本上。但问题出在check(item, specificArg)
,编译器报告:
incompatible integer to pointer conversion passing 'bool' to parameter of type 'bool (*)(Item *, void *)'
答案 0 :(得分:1)
在执行check(item, specificArg)
时,你实际上正在调用该函数并将其返回值传递给report
的调用,而它期望一个函数指针。
正确的调用语法是:
report(list, check, arg);
答案 1 :(得分:0)
函数原型
void report(List*, bool check(Item*, void*), void*);
需要3个参数,
List *
Item *
和void *
并返回bool - 此参数名为check
void *
,也是未命名的。您使用report(list, check(item, specificArg), arg)
调用它请注意,您传递的第二个参数是bool
- >调用check(item, specificArg)
的结果。因此不匹配。
答案 2 :(得分:0)
这个原型不正确:
void report(List*, bool check(Item*, void*), void*);
建议这个原型
void report( List*, bool, Item*, void*, void* );
然后签名将是:
void report( List* pMyList, Item* pmyItem, void* parm1, void* parm2 )
然后在报告功能中:
bool mybool = check( pMyItem, parm1 );
但是,如果您想传递不同的功能,请建议使用以下原型:
void report(List*, (bool (*)(Item*, void*)), void*);