2011-02-15 104 views
1

谁能解释#indef的定义,无效(*销毁)(void *的数据)的#ifndef(*销毁)(*匹配)

int (*match)(const void *key1,const void *key2) 

在以下几点:

#ifndef LIST_H 
#define LIST_H 
#include <stdio.h> 

typedef struct _ListElmt{ 

void    *data; 
struct ListElmt  *next; 

} ListElmt; 
typedef struct _List{ 

int     size; 
int     (*match)(const void *key1, const void *key2); 
void    (*destroy)(void *data); 

ListElmt    *head; 
ListElmt    *tail; 

} List; 

void list_init(List *list, void (*destroy)(void *data)); 

void list_destroy(List *list); 

int list_ins_next(List *list, ListElmt *element, const void *data); 

int list_rem_next(List *list, ListElmt *element, void **data); 

int list_size(const List *list); 

ListElmt *list_head(const List *list); 

ListElmt *list_tail(const List *list); 

int list_is_head(const ListElmt *element); 

int list_is_tail(const ListElmt *element); 

void *list_data(const ListElmt *element); 

ListElmt *list_next(const ListElmt *element); 
#endif 
+0

设置您的代码的格式 – Falmarri 2011-02-15 22:30:48

+5

另请参见:接受更多答案。 – 2011-02-15 22:31:49

回答

1

#ifndef指令是的一部分,包括guard,这是几乎在所有头文件中发现的一段C代码,用于防止多重包含。 C头文件的一般结构是

#ifndef Some_Symbol 
#define Some_Symbol 

/* ... body of the header file ... */ 

#endif 

开始散列这些线被称为预处理器direectives并且指示预处理器来修改此代码编译器开始其翻译成代码之前。 #ifndef指令代表“IF未定义”,并且是编译时if语句。上面代码的含义是

if (I haven't seen the symbol "Some_Symbol") { 
    Define the symbol "Some_Symbol", so now I have seen it; 
    Compile the body of the header file; 
} 

(这不是有效的C,但它得到了重点)。

这个结构背后的想法是,如果你同一个文件两次,那么第一次,因为编译器似乎没有给定的符号,它会去并包括头的内容。但是,在任何连续的迭代中,编译器都会看到该符号,因此它不会尝试第二次放入相同的代码。

至于你的神秘线

void (*destroy)(void *data); 

这是一个函数指针指向该接受一个void *并返回void功能。例如,它可以指向函数

void FreeMyData(void *data); 

void FreeMyStringData(void *data); 

虽然不是

int printf(const char* fmtString, ...); 

这个功能背后的intution是,如果你正在构建一个通用的链表C,列表需要知道列表回收时应该处理存储在列表中的元素的某种方式。为了做到这一点,用户必须指定一个函数来说明如何完成这项工作。这是存储在destroy指针,以便被释放的名单时,你可以做这样的事情:

myList->destroy(myUserData); 

这让文章以确保内存被清理,即使她不知道什么样的数据将在那里。她可以假设用户将提供适当的清理代码,然后只需在列表清理中指定应该运行清理代码的时间。

希望这会有所帮助!

2

#ifndef行是header guard的开头。这可以防止头部在同一个上下文中被包含两次。

该行void (*destroy)(void *data)定义了function pointer。这是一个指向函数的指针,它将void*作为参数并返回void,并且指针的名称是destroy

变量match也是一个函数指针。