2014-03-13 41 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( )? –