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

C中函数指针typedef的循环引用,c,struct,function-pointers,circular-dependency,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; 不幸的是,这会创建一个循环引用 我需要在哈希函数定义中指

我想定义一个具有可交换哈希函数的哈希表。哈希函数将获取一个指向哈希表的指针和要哈希的键,返回一个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解决方案优先

在定义中使用结构之前,可以先声明它。这将告诉编译器该结构存在,但稍后将完全定义它。大概是这样的:

/* 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;

哈!又好又简单。不知道您可以声明然后“重新声明”结构。非常感谢!现在你知道了!:-)我在学习C和实现链表时也遇到了同样的问题。。。