2010-12-11 25 views
4

交換可能なハッシュ関数を持つハッシュテーブルを定義したいと思います。ハッシュ関数はそうのようにint型を返す、ハッシュテーブルとハッシュ化されるキーへのポインタを取る:Cの関数ポインタのtypedefの循環参照

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ソリューションが望ましい!

答えて

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; 
+0

ハァ!ニースとシンプル。構造体を宣言してから再宣言できるかどうかは分かりませんでした。どうもありがとう! – majelbstoat

+0

さあ、やって! :-)私はCを学んでリンクリストを実装したときも同じ問題を抱えていました... –