出于教育目的,我正在 C 中创建哈希表的实现。
散列函数应该返回一个 size_t 散列。由于 size_t 的大小在不同的平台上是不同的(并且我想使用一个散列函数来散列 size_t 中的所有位),我想为不同的大小创建不同的散列函数。由于哈希函数将用作函数指针,我怀疑编译器不能像这样内联代码:
size_t hash4(void* key, size_t size);
size_t hash8(void* key, size_t size);
size_t hash(void* key, size_t size)
{
if (sizeof(size_t) == 4)
{
return hash4(key, size);
}
else if (sizeof(size_t) == 8)
{
return hash8(ket, size);
}
}
size_t (*hashFunc)(void* key, size_t size) = hash;
每次调用散列函数时都会使用两级间接。
这就是为什么我想做这样的事情:size_t (*hashFunc)(void* key, size_t size) = hash##sizeof(size_t);
而不是。只会使用一级间接。问题是 sizeof 运算符在 prepossessing 阶段不可用。
那么定义一个预处理器值的好方法是什么,它将在每个平台上扩展到正确的 size_t 大小?我想我可以检查预定义的宏,但我想知道是否有更好的方法。