size_t预处理器值的大小

我正在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);代替.只使用一个间接级别.问题是在prepossessing阶段期间sizeof运算符不可用.

那么,定义一个预处理器值的好方法是什么,它将在每个平台中扩展到size_t的正确大小?我想我可以检查预定义的宏,但我想知道是否有更好的方法.

最佳答案
你可以这样做:

size_t (*hashFunc)(void* key, size_t size) = (sizeof(size_t) == 8) ? hash8 : hash4;

eznme的方法也没有错 – 根据size_t的大小编写一个行为不同的函数.当然,如果您在64位实现上不需要hash4函数用于其他目的.

关于问题的标题 – 如果您在预处理器时间绝对需要了解size_t,那么请使用stdint.h中的SIZE_MAX宏.

转载注明原文:size_t预处理器值的大小 - 代码日志