由于process_data返回map_iterate的结果,而process_data的返回类型为int,那么map_iterate的返回类型必须为int:
int map_iterate( ... );
输入参数map直接传递给map_iterate,而map的类型为struct map_t *,所以map_iterate的第一个参数必须为struct map_t *类型:
int map_iterate( struct map_t *, ... );
像map,process 是直接传递的,并且具有struct process_t * 类型,所以最后一个参数必须具有struct process_t * 类型:
int map_iterate( struct map_t *, ..., struct process_t * );
这就是事情变得时髦的地方。表达式iter_cb 不调用 iter_cb 函数;相反,它解析为指向该函数的指针,并且表达式的类型是bool (*)(struct pair_t *,void *)(指向指向struct pair_t 和void 并返回bool 的函数的指针),所以你的原型现在看起来像
int map_iterate( struct map_t *, bool (*)(struct pair_t *, void *), struct process_t * );
使用(短)标识符,您会得到
int map_iterate( struct map_t *m, bool (*f)(struct pair_t *, void *), struct process_t *p );
注意static 是一个存储类说明符,而不是类型说明符,所以它在map_iterator 原型中的第二个参数的声明中不起作用。在iter_cb函数的声明/定义中,它只指定函数名称iter_cb不被导出到链接器,这意味着函数不能在当前翻译单元(即当前源文件)之外通过名称调用)。