我有这样的结构
typedef enum {
STATE_PAUSED = 0,
STATE_RUN,
STATE_COUNTING,
STATE_PERIODIC,
} State_t;
我需要的是扩展到仅在本地引起轰动的新州。 基本上,我想有一个既能处理原始me-> State又能处理扩展的State的开关。
所以我想将它们全部包装在一个本地联合中,但是我不知道怎么做:) 当然,我会注意重叠的值。
typedef union{
State_t OrigState;
typedef enum {
GPS_MCU_UART_DEFAULT = 10,
}LocalState;
}State;
switch((State)(me->State))
{
case STATE_RUN:
break;
case GPS_MCU_UART_DEFAULT:
break;
}
感谢一些帮助。
答案 0 :(得分:2)
只要不需要枚举作为类型,就可以很容易地做到这一点。
enum State{
STATE_PAUSED = 0,
STATE_RUN,
STATE_COUNTING,
STATE_PERIODIC,
STATE_MAX // must be last
};
enum GPS_State{
GPS_MCU_UART_DEFAULT = STATE_MAX,
GPS_FOO,
GPS_BAR
};
enum Other_State{
OS_CORGI = STATE_MAX,
OS_FOO,
OS_BAR
};
这确实意味着可以存储所有这些状态的变量将需要为int
。我不确定在强制类型安全的同时是否有 方法。
答案 1 :(得分:0)
好吧...谢谢您的反对票(有人会仔细检查)。
似乎在C语言中,您不能扩展枚举。 多亏了这篇文章,我发现了一个对我来说很完美的技巧 Warning : case not evaluated in enumerated type?
将cast转换为int,而不是将旧枚举转换为int: -编译器不会抱怨缺少sw条目 -编译器不会抱怨未使用的xxx_t
如果有人需要在C语言中“扩展枚举”,这是我的解决方案
typedef enum {
GPS_MCU_UART_DEFAULT = 10,
}xxx_t;
switch((int)(xxx_t)(me->State))
{
case STATE_RUN:
break;
case GPS_MCU_UART_DEFAULT:
break;
}
我将投票给蒂姆,谢谢!