C/C++ 枚举中的 if else

发布于 2024-08-08  14 次阅读


  本文旨在解决C/C++中处理枚举的if else嵌套问题。假设我们有如下的enum定义:

enum {
    PSEUDO_COLOR_IRON_BOW = 0,
    PSEUDO_COLOR_WHITE_HOT,
    PSEUDO_COLOR_BLACK_HOT,
    PSEUDO_COLOR_RAINBOW,
    PSEUDO_COLOR_RAINBOW_HC,
    PSEUDO_COLOR_IRON_BOW_F8,
    PSEUDO_COLOR_IRON_BOW_F10,
    PSEUDO_COLOR_NUMS,
};

如果我们想要实现如下的判断:


if (param in PSEUDO_COLOR_NUMS)

那我们使用的方法无法是:if else的嵌套、一个if中多个orswitch映射。但对于这种连续的enum来说,我们可以使用位移来进行一个简单的判断。

  假设我们最大枚举到了6,需要判断的数是data。我们可以设置一个0b 0111 1111,使1 < data,然后将其进行与操作,以判断1是否被左移出区间。代码如下:

const uint8_t VALID_PSEUDO_COLORS = 0b01111111;

if (VALID_PSEUDO_COLORS & (1 << data))
{
    // pseudo_color = data;
}
else
{
    return error;
}

  进一步的,如果我们PSEUDO_COLOR_NUMS = 10,那么我们需要让VALID_PSEUDO_COLORS的低10+1位都为1,高位都为0,即可比较。我们进一步地可以将程序写为:

const uint16_t VALID_PSEUDO_COLORS = (1 << PSEUDO_COLOR_NUMS) - 1;