2010-12-11 2 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

Hah! 좋고 간단합니다. 당신이 구조체를 선언하고 다시 선언 할 수 있다는 것을 몰랐습니다. 매우 감사합니다! – majelbstoat

+0

이제 해보세요! :-) 나는 C 언어를 배우고 링크 된 목록을 구현할 때 같은 문제가 발생했습니다 ... –