我想用可交换的哈希函数定义哈希表。哈希函数将获取一个指向哈希表的指针和要进行哈希处理的键,返回一个如下所示的int:
typedef int (hash_function_t) (hashtable *, int);
其中哈希表存储指向将用于散列键的函数的指针:
typedef struct ht {
size_t size;
...
hash_function_t *hash_function;
} hashtable;
不幸的是,这会创建一个循环引用。
我需要指向哈希函数定义中哈希表的指针,因此我可以对哈希表大小做一个模数,因此它不会超过桶的最大数量。我需要哈希表中的哈希函数,这样我就不必在整个地方传递哈希函数指针。
我意识到这会产生如下代码:
*ht->hash_function (ht, key)
这有点奇怪,但我对此很好。
以任何顺序放置typedef都不起作用。我是否必须在哈希表中使用长定义,然后再使用typedef,还是有更好的方法?
这些都是直接C,没有C ++。 ANSI C解决方案首选!
答案 0 :(得分: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;