我正在编写一个通用哈希表,我创建了一个typedef:
typedef unsigned long(*hashFunction_t)(void*,unsigned long);
表示散列函数。
然后我在函数add:
中使用它int add(HashTable *table, hashFunction_t h, void *data);
然而,我收到一个警告"从不兼容的指针类型初始化"在这一行:
hashFunction_t hash = JenkinsHash;
因为JenkinsHash有参数:
unsigned long JenkinsHash(const char *str, unsigned long mod);
所以我的问题是,如何将JenkinsHash转换为参数:
(void*,unsigned long)
感谢您的帮助!
答案 0 :(得分:4)
在不调用未定义行为的情况下执行此操作的最佳方法是使用适当的签名创建一个新的thunk函数,为您执行强制转换。开销很小,你可以避免非常不安全的类型转换。
unsigned long JenkinsHashThunk(void *str, unsigned long mod)
{
return JenkinsHash((const char*)str, mod);
}