为什么函数中的函数被视为指针?

时间:2017-10-23 22:50:37

标签: c function pointers

我对指针和函数指针有点熟悉,但这很令人困惑。我有一个函数,这是它的函数头;

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 *)'

3 个答案:

答案 0 :(得分:1)

在执行check(item, specificArg)时,你实际上正在调用该函数并将其返回值传递给report的调用,而它期望一个函数指针。

正确的调用语法是: report(list, check, arg);

答案 1 :(得分:0)

函数原型

void report(List*, bool check(Item*, void*), void*);

需要3个参数,

  1. 未命名的List *
  2. 指向函数的指针,该函数接受Item *void *并返回bool - 此参数名为check
  3. 一个void *,也是未命名的。
  4. 您使用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*);