我需要为我正在处理的项目使用FIFO。我在互联网上发现了这个实现,我无法弄清楚这个函数是怎么回事。我希望有人能够启发我。特定的C fifo实现混淆
/* Free an entire fifo */
void fifo_free(fifo_t *f, void (*freefn)(void *))
{
fifonode_t *fn = f->f_head;
fifonode_t *tmp;
if (freefn == NULL)
freefn = fifo_nullfree;
while (fn) {
(*freefn)(fn->fn_data);
tmp = fn;
fn = fn->fn_next;
free(tmp);
}
free(f);
}
...
/*ARGSUSED*/
static void fifo_nullfree(void *arg)
{
/* this function intentionally left blank */
}
看看它是如何使用
void (*freefn)(void *)
作为参数?为什么?为什么该指针传递给函数?(*freefn)(fn->fn_data)
这是什么意思?
if (freefn == NULL) freefn = fifo_nullfree;
这种情况下的评论会不会有效?
你可以看到这个实现的完整副本here
'(* freefn)(fn-> fn_data);''在while循环之后立即?这是一种演员吗? –
@JeffersonHudson,它意味着用指向函数的指针调用一个函数。因为freefn是一个指向函数的指针,所以你可以认为(* freefn)作为函数和(* freefn)(fn-> fn_data),意味着你正在调用函数和实际参数。总之这行也可以写成freefn(fn-> data)。您可以在这里阅读更多信息:http://www.c-faq.com/ptrs/funccall.html –
我是否认为'freefn = fifo_nullfree'使函数指针'freen'指向函数fifo_nullfree( )? –