2010-12-11 58 views
4

我想定義一個帶有可交換散列函數的散列表。散列函數將採取一個指針到哈希表和密鑰被散列,返回像這樣一個int:函數指針的typedef的循環引用C

typedef int (hash_function_t) (hashtable *, int); 

在散列表中存儲有指針將被用於散列鍵功能:

typedef struct ht { 
    size_t size; 
    ... 
    hash_function_t *hash_function; 
} hashtable; 

不幸的是,這會創建一個循環引用。

我需要指向散列表函數定義中的散列表,所以我可以對散列表大小做一個模數,所以它不會超過最大數量的存儲區。我需要散列表中的散列函數,以便我不必將散列函數指針傳遍整個地方。

我意識到這將導致這樣的代碼:

*ht->hash_function (ht, key) 

這是一個有點古怪,但我很好這一點。

以任意順序放置typedefs不起作用。我必須在散列表中使用長定義,然後再進行typedef,還是有更好的方法?

這是所有旨在直C,沒有C++。 ANSI C解決方案是首選!

回答

11

您可以在定義中使用它之前聲明該結構。這告訴編譯器該結構存在,但稍後將完全定義。類似這樣的:

/* declare it first */ 
struct ht; 

typedef int (hash_function_t) (struct ht *, int); 

typedef struct ht { 
    size_t size; 
    ... 
    hash_function_t *hash_function; 
} hashtable; 
+0

哈!很好很簡單。不知道你可以聲明,然後'重新聲明'一個結構。非常感謝! – majelbstoat 2010-12-11 09:46:21

+0

現在你做到了! :-)當我學習C並實現鏈表時,我遇到了同樣的問題... – 2010-12-11 09:47:40