2010-12-11 57 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