c语言switch const,C语言中的constexpr(或等效语言)

Henri Menke..

5

我参加聚会有点晚,但最近遇到了同样的问题。

对于这样一个简单的哈希函数,您可以仅使用C预处理器来实现。缺点是预处理器无法将字符串拆分为字符,因此hash("first")您不必编写HASH('f','i','r','s','t')。该HASH宏使用实现的__VA_ARGS__,并适用于多达8个字符的字符串。

我还把散列函数从递归函数变成了迭代函数,它比较容易阅读,不需要可选参数。生成的程序集几乎相同(https://godbolt.org/z/1g8LPI)。

#include

typedef unsigned long uint64;

#define HASH_BASIS 17UL

#define HASH_PRIME 11UL

#define HASH_1(ARG1) ((ARG1 ^ HASH_BASIS) * HASH_PRIME)

#define HASH_2(ARG1, ARG2) ((ARG2 ^ HASH_1(ARG1)) * HASH_PRIME)

#define HASH_3(ARG1, ARG2, ARG3) ((ARG3 ^ HASH_2(ARG1, ARG2)) * HASH_PRIME)

#define HASH_4(ARG1, ARG2, ARG3, ARG4) \

((ARG4 ^ HASH_3(ARG1, ARG2, ARG3)) * HASH_PRIME)

#define HASH_5(ARG1, ARG2, ARG3, ARG4, ARG5) \

((ARG5 ^ HASH_4(ARG1, ARG2, ARG3, ARG4)) * HASH_PRIME)

#define HASH_6(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \

((ARG6 ^ HASH_5(ARG1, ARG2, ARG3, ARG4, ARG5)) * HASH_PRIME)

#define HASH_7(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) \

((ARG7 ^ HASH_6(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6)) * HASH_PRIME)

#define HASH_8(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) \

((ARG8 ^ HASH_7(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7)) * HASH_PRIME)

#define HASH_COUNT(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8, func, ...) \

func

#define HASH(...) \

HASH_COUNT(__VA_ARGS__, HASH_8(__VA_ARGS__), HASH_7(__VA_ARGS__), \

HASH_6(__VA_ARGS__), HASH_5(__VA_ARGS__), HASH_4(__VA_ARGS__), \

HASH_3(__VA_ARGS__), HASH_2(__VA_ARGS__), HASH_1(__VA_ARGS__))

uint64 hash(const char *text) {

uint64 h = HASH_BASIS;

char c;

while ((c = *text++) != '\0') {

h = (c ^ h) * HASH_PRIME;

}

return h;

}

int main(int argc, char *argv[]) {

const char *text = argc > 1 ? argv[1] : "";

switch (hash(text)) {

case HASH('f', 'i', 'r', 's', 't'):

puts(text);

break;

case HASH('s', 'e', 'c', 'o', 'n', 'd'):

puts(text);

break;

case HASH('t', 'h', 'i', 'r', 'd'):

puts(text);

break;

default:

puts("oops");

break;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值