【问题标题】:Circular reference for typedef of function pointer in CC中函数指针typedef的循环引用
【发布时间】:2010-12-11 09:37:10
【问题描述】:

我想定义一个带有可交换哈希函数的哈希表。散列函数将采用指向散列表的指针和要散列的键,返回一个 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 解决方案!

【问题讨论】:

    标签: c struct function-pointers circular-dependency


    【解决方案1】:

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

    /* 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 并实现链表时遇到了同样的问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2023-04-03
    • 2010-12-08
    • 2011-05-16
    相关资源
    最近更新 更多