我需要爲我正在處理的項目使用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( )? –