2014-03-13 73 views
1

我需要爲我正在處理的項目使用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 */ 
} 
  1. 看看它是如何使用void (*freefn)(void *)作爲參數?爲什麼?爲什麼該指針傳遞給函數? (*freefn)(fn->fn_data)

  2. 這是什麼意思?

    if (freefn == NULL) 
        freefn = fifo_nullfree; 
    

    這種情況下的評論會不會有效?

你可以看到這個實現的完整副本here

回答

4
  1. 的fifo_free功能只知道如何釋放用於fifonode_t項目的內存,它不知道如何處理的數據做(由fn_data指向)在這些項目中。這是freefn進來的地方。

    參數void (*freefn)(void *)是指向函數的指針。該函數需要一個void指針。這用於釋放存儲在FIFO中的每個fifonode_t的數據。

  2. 在某些情況下,你可能不需要做任何事情來釋放額外的數據(比如說你正在存儲指向其他靜態數據的指針)。在這種情況下,您可以傳遞NULL作爲freefn,函數將使用fifo_nullfree作爲函數,它基本上什麼都不做。

    注意:fifo_free函數可以輕鬆完成循環內部的if測試,並且只在freefn函數不爲NULL時才調用該函數。可能他們有一些理由不這樣做。

+0

'(* freefn)(fn-> fn_data);''在while循環之後立即?這是一種演員嗎? –

+1

@JeffersonH​​udson,它意味着用指向函數的指針調用一個函數。因爲freefn是一個指向函數的指針,所以你可以認爲(* freefn)作爲函數和(* freefn)(fn-> fn_data),意味着你正在調用函數和實際參數。總之這行也可以寫成freefn(fn-> data)。您可以在這裏閱讀更多信息:http://www.c-faq.com/ptrs/funccall.html –

+0

我是否認爲'freefn = fifo_nullfree'使函數指針'freen'指向函數fifo_nullfree( )? –