在C中"分组"枚举值

A P*_*son 15 c enums

如果我有一些像这样的枚举

typedef enum {
    AN_TRISTATE_0,
    AN_TRISTATE_1,
    AN_NOTHING,
    AN_MOTOR_1,
    AN_MOTOR_2,
    AN_MOTOR_3,
    AN_SENSOR_1,
    AN_SENSOR_2,
    AN_SENSOR_3,
    AN_SENSOR_4,
    AN_SENSOR_5
} adc_pin_func_t;
Run Code Online (Sandbox Code Playgroud)

adc_pin_func_t a_particular_pin = ...
Run Code Online (Sandbox Code Playgroud)

是否有可能检查引脚是否属于特定组,例如引脚是其中的一部分AN_MOTOR或部分AN_SENSOR,而不是必须检查每个可能组中的每个项目.

或者除了使用枚举之外,还有更有效的方法吗?

提前致谢

tro*_*foe 22

您可以为每个组创建掩码:

typedef enum {
    AN_TRISTATE_0     = 0x00001,
    AN_TRISTATE_1     = 0x00002,
    AN_TRISTATE_MASK  = 0x0000f,

    AN_NOTHING        = 0x00010,    // Should this be 0x00000 ?

    AN_MOTOR_1        = 0x00100,
    AN_MOTOR_2        = 0x00200,
    AN_MOTOR_3        = 0x00400,
    AN_MOTOR_MASK     = 0x00f00,

    AN_SENSOR_1       = 0x01000,
    AN_SENSOR_2       = 0x02000,
    AN_SENSOR_3       = 0x04000,
    AN_SENSOR_4       = 0x08000,
    AN_SENSOR_5       = 0x10000,
    AN_SENSOR_MASK    = 0xff000
} adc_pin_func_t;
Run Code Online (Sandbox Code Playgroud)

然后使用&运算符简单地针对掩码测试组:

if (a_particular_pin & AN_SENSOR_MASK)
{
    // it's a sensor pin
}
else if (a_particular_pin & AN_MOTOR_MASK)
{
    // it's a motor pin
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如其他人建议使用范围,那么您可能可以为测试创建一个宏,这将允许您更改测试的执行方式,而无需更改代码(总是一件好事):

#define IS_AN_SENSOR(x) (((x) & AN_SENSOR_MASK) != 0)
#define IS_AN_MOTOR(x) (((x) & AN_MOTOR_MASK) != 0)
// etc.
Run Code Online (Sandbox Code Playgroud)

然后测试成为:

if (IS_AN_SENSOR(a_particular_pin))
{
    // it's a sensor pin
}
else if (IS_AN_MOTOR(a_particular_pin))
{
    // it's a motor pin
}
// etc
Run Code Online (Sandbox Code Playgroud)

如果您需要更改为使用范围,则只需要更改宏(并且您显然需要定义范围最小值/最大值):

#define IS_AN_SENSOR(x) ((x) >= AN_SENSOR_START && (x) <= AN_SENSOR_END)
// etc
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,比我的答案更好,因为不那么特殊.+1 (2认同)