C,用枚举联合扩展枚举

时间:2018-08-22 16:50:38

标签: c

我有这样的结构

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;

    }

感谢一些帮助。

2 个答案:

答案 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;


    }

我将投票给蒂姆,谢谢!