Я создаю реализацию хэш-таблицы в C для образовательных целей.size of_t препроцессор значение
Хеш-функция должна возвращать хэш-размер 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 недоступен во время фазы предпозиционирования.
Итак, что было бы хорошим способом определить значение препроцессора, которое будет расширяться до нужного размера size_t на каждой платформе? Думаю, я мог бы проверить предопределенные макросы, но мне интересно, есть ли лучший способ.
Видимо, я могу использовать его для инициализации постоянных указателей функций внутри структуры, поэтому, я думаю, я предпочитаю это на самом деле. –