C中函数指针的typedef的循环引用

时间:2010-12-11 09:37:10

标签: c struct function-pointers circular-dependency

我想用可交换的哈希函数定义哈希表。哈希函数将获取一个指向哈希表的指针和要进行哈希处理的键,返回一个如下所示的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解决方案首选!

1 个答案:

答案 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;