C联合内部的引用类型

时间:2017-12-14 17:10:57

标签: c enums typedef unions

我想在union中引用一个类型。我有以下代码:

typedef union
{
    typedef enum DIGITS_T
    {
        DIGIT_1 = 0,
        DIGIT_2 = 1,
        DIGIT_3 = 2,
        DIGIT_4 = 3

    } DIGITS;

    typedef enum SEGMENTS_T
    {
        SEG_1 = 0,
        SEG_2 = 1,
        SEG_3 = 2,
        SEG_4 = 3,
        SEG_5 = 4,
        SEG_6 = 5,
        SEG_7 = 6,
        SEG_8 = 7

    } SEGMENTS;
} DISPLAY_1;

我希望能够执行DISPLAY_1.DIGITS或DISPLAY1.SEGMENTS之类的操作,但是在访问DISPLAY1时,我只会看到DIGIT_1,DIGIT_2,DIGIT_3,DIGIT_4,SEG_1,SEG_2等列表。

是否有可能做我正在追求的事情或者我没有正确使用工会?

谢谢!

1 个答案:

答案 0 :(得分:1)

即使看起来我对某些人的原始问题不够清楚,但Eugene Sh能够回答它。

基本上我有两个typedef枚举的DIGITS和SEGMENTS。我需要一种方法将这些一般应用于显示DISPLAY_1和DISPLAY_2,它们是工会。因此,我可以使用DISPLAY_1.DIGITS或DISPLAY_1.SEGMENTS访问显示1或显示2的数字或段。这是有效的,除了我需要能够使用枚举类型的switch语句。

所以我需要做的是在联合之外定义我的枚举枚举,然后将它们作为联合内部的项引用。我的代码发布在下面。

枚举:

typedef enum DIGITS_T
{
    DIGIT_1 = 0,
    DIGIT_2 = 1,
    DIGIT_3 = 2,
    DIGIT_4 = 3,
    DIGIT_NOTHING = 4

}DIGITS;


typedef enum SEGMENTS_T
{
    SEG_1 = 0,
    SEG_2 = 1,
    SEG_3 = 2,
    SEG_4 = 3,
    SEG_5 = 4,
    SEG_6 = 5,
    SEG_7 = 6,
    SEG_8 = 7,
    SEG_NOTHING = 8

} SEGMENTS;

联盟:

typedef union
{
    DIGITS Digits;
    SEGMENTS Segments;

} DISPLAY_1;

typedef union
{
    DIGITS Digits;
    SEGMENTS Segments;

} DISPLAY_2;

typedef union
{
    DISPLAY_1 Display_1;
    DISPLAY_2 Display_2;

} DISPLAYS;

示例用法:

void Clear_Digit(DISPLAYS display, DIGITS passed_digit)
{
    switch(display)
    {
        case DISPLAYS.Display_1:

            switch(passed_digit)
            {
                case DIGIT_1:

                    break;

                case DIGIT_2:

                    break;

                case DIGIT_3:

                    break;

                case DIGIT_4:

                    break;
            }

            break;

        case DISPLAYS.Display_2:

            switch(passed_digit)
            {
                case DIGIT_1:

                    break;

                case DIGIT_2:

                    break;

                case DIGIT_3:

                    break;

                case DIGIT_4:

                    break;
            }

            break;
    }
}