C 结构中的枚举

C 结构中的枚举,c,struct,enums,structure,unions,C,Struct,Enums,Structure,Unions,我的C文件有一个结构和一个枚举 struct list{ enum {1 , 2 ,3, 4}; //defining a variable 'a' }; 我希望变量的数据类型取决于枚举的选择。例如:如果选择了枚举“1”,则“a”应为“int”,“2”表示浮点等。您需要修复枚举;你不能定义这样的数字列表。 那么你可能会使用工会 现在您可以定义: struct list l1 = { .type = T_INT, .v_int = -937 }; struct list l2 =

我的C文件有一个结构和一个枚举

struct list{
    enum {1 , 2 ,3, 4};
    //defining a variable 'a'
};
我希望变量的数据类型取决于枚举的选择。例如:如果选择了枚举“1”,则“a”应为“int”,“2”表示浮点等。

您需要修复枚举;你不能定义这样的数字列表。 那么你可能会使用工会

现在您可以定义:

struct list l1 = { .type = T_INT, .v_int = -937 };
struct list l2 = { .type = T_FLOAT, .v_float = 1.234 };

if (l1.type == l2.type)
    …the values can be compared…
else
    …the values can't be compared directly…

printf("l1.type = %d; l1.v_int = %d\n", l1.type, l1.v_int);
如果没有可用的C11和匿名联合,则需要为联合命名:

struct list
{
    enum { T_UNKNOWN, T_INT, T_FLOAT } type;
    union
    {
        int     v_int;
        float   v_float;
    } u;   // C99 or C90
};
假设C99具有指定的初始值设定项,则可以使用:

struct list l1 = { .type = T_INT, .u = { .v_int = 1 } };

如果没有C99,则只能初始化联合的第一个元素,即v_int成员

传统上,工会使用非常短的单字母名称;代码中对它不感兴趣,但它在C11之前是必需的。

您需要修复枚举;你不能定义这样的数字列表。 那么你可能会使用工会

现在您可以定义:

struct list l1 = { .type = T_INT, .v_int = -937 };
struct list l2 = { .type = T_FLOAT, .v_float = 1.234 };

if (l1.type == l2.type)
    …the values can be compared…
else
    …the values can't be compared directly…

printf("l1.type = %d; l1.v_int = %d\n", l1.type, l1.v_int);
如果没有可用的C11和匿名联合,则需要为联合命名:

struct list
{
    enum { T_UNKNOWN, T_INT, T_FLOAT } type;
    union
    {
        int     v_int;
        float   v_float;
    } u;   // C99 or C90
};
假设C99具有指定的初始值设定项,则可以使用:

struct list l1 = { .type = T_INT, .u = { .v_int = 1 } };

如果没有C99,则只能初始化联合的第一个元素,即v_int成员


传统上,工会使用非常短的单字母名称;代码中对它不感兴趣,但它在C11之前是必需的。

数据可以存储在一个联合体中。需要一个单独的变量来指示正在使用的联合成员。数据可以存储在联合中。需要一个单独的变量来指示正在使用的工会成员。这是对各种语言版本的支持的一次很好的介绍。感谢您提供详细的答案。但是“未知”有什么用呢?两个变量的名称是否相同,而不是v_int和v_float;结构列表l1={.type=T_INT,.v=-937};结构列表l2={.type=T_FLOAT,.v=1.234};我希望发生这种情况,值T_UNKNOWN只是占据了值0,因此T_INT是1,T_FLOAT是2,根据请求。它还可以用作默认初始值设定项,指示尚未设置类型。不,不能对v_int和v_float使用相同的名称;对于不同的类型,名称必须不同。这是一个可爱的穿行,通过各种语言版本的支持。感谢详细的回答。但是“未知”有什么用呢?两个变量的名称是否相同,而不是v_int和v_float;结构列表l1={.type=T_INT,.v=-937};结构列表l2={.type=T_FLOAT,.v=1.234};我希望发生这种情况,值T_UNKNOWN只是占据了值0,因此T_INT是1,T_FLOAT是2,根据请求。它还可以用作默认初始值设定项,指示尚未设置类型。不,不能对v_int和v_float使用相同的名称;不同类型的名称必须不同。