2011-02-15 19 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也是一個函數指針。