以前 紹介した、複雑な C 言語のおける宣言を少し簡略にすることができる方法のメモ。
まずは、このコード。
1 2 3 4 5 6 7 8 9 10 | unsigned int RSHash (const char *key, int size); unsigned int DEKHash (const char *key, int size); unsigned int DJBHash (const char *key, int size); unsigned int (*hashList[4])(const char *, int) = {RSHash, DEKHash, DJBHash, NULL}; unsigned int (**mover)(const char *key, int size); mover = hashList |
最初の 3 行は関数の宣言です。 3 つのハッシュ関数があります。2 つ目の hashList は、この関数へのポインタの配列です。関係ないですが、最後の mover は、この配列へのポインタです。
そして、こんな感じに関数へのポインタを返す関数を書きたいとします。
1 2 3 | unsigned int (*hash)(const char *, int); hash = selectHash(3, hashList); |
普通に書くとこんな感じになります。
1 2 3 4 5 6 7 | unsigned int (*selectHash( int n, unsigned int (*hashList[])(const char *, int))) (const char *, int) { return hashList[rand() % n]; } |
ちょっときついので、これを typedef を使用して書くとだいぶ楽になる。
1 2 3 4 5 6 | typdef unsigned int HASHFNCT(const char *, int); HASHFNCT *selectHash(int n, HASHFNCT *hashList[]) { return hashList[rand() % n]; } |