Циркулярная ссылка для typedef указателя функции в C - PullRequest
4 голосов
/ 11 декабря 2010

Я хотел бы определить хеш-таблицу с заменяемой хеш-функцией.Хеш-функция будет принимать указатель на хеш-таблицу и ключ, который будет хешироваться, возвращая 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 позже, или есть лучший способ?

Это все предназначено для прямого C, а не C ++.Решения ANSI C предпочтительнее!

1 Ответ

11 голосов
/ 11 декабря 2010

Вы можете объявить структуру, прежде чем использовать ее в определении. Это говорит компилятору, что структура существует, но она будет полностью определена позже. Примерно так:

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