代码之家  ›  专栏  ›  技术社区  ›  Midas

在枚举声明中使用数据类型

  •  0
  • Midas  · 技术社区  · 14 年前

    我能做这样的事吗?我想在枚举中使用数据类型而不是常量 type_t .

    typedef struct {
        char id;
        long data;
    } type1_t;
    
    typedef struct {
        char id;
        long data;
        float moredata;
    } type2_t;
    
    typedef enum {
        type1_t, type2_t
    } type_t;
    
    typedef struct {
        type_t type;
        char* something;
    } midas;
    
    midas obj1;
    obj1.type = type1_t;
    obj1.type.id = 0;
    obj1.type.data = 123;
    
    midas obj2;
    obj2.type = type2_t;
    obj2.type.id = 3;
    obj2.type.data = 456;
    obj2.type.moredata = 3.14;
    

    在这个例子中 type 变量 midas 然后struct应该引用 type1_t type2_t . 所以如果我把类型设置为 类型2 ,它的大小应该比我设定的要大 类型1 .

    5 回复  |  直到 14 年前
        1
  •  2
  •   cdhowie    14 年前

    不,你不能那样做。如果您使用C++,可以使用模板来实现这一点。但是C语言中没有“类型枚举”机制。

    你可以考虑成立一个工会:

    typedef enum {
        type1, type2
    } type_t;
    
    typedef struct {
        type_t typecode;
        union {
            type1_t type1value;
            type2_t type2value;
        };
        char* something;
    } midas;
    

    这会导致 midas.type1value midas.type2value 占用相同的内存空间。联合所占用的内存量将等于存储其包含的最大数据类型所需的内存量。

    那你就得看看 midas.typecode 并考虑使用哪个工会成员。如果使用错误的数据,将导致无效数据,这可能会导致程序崩溃,因此要小心。

        2
  •  2
  •   Adam Rosenfield    14 年前

    不。在C语言中,通常的方法是使用联合:

    typedef enum { TYPE1, TYPE2 } type_t;
    
    typedef struct {
        type_t type;
        union
        {
            type1_1 t1;
            type2_t t2;
        } u;
    } midas;
    
    midas obj1;
    obj1.type = TYPE1;
    obj1.u.t1.id = 0;
    obj1.u.t1.data = 123;
    
    midas obj2;
    obj2.type = TYPE2;
    obj2.u.t2.id = 3;
    obj2.u.t2.data = 456;
    obj2.u.t2.moredata = 31.14;
    
        3
  •  1
  •   Ben Jackson    14 年前

    我想你在找 union

        4
  •  1
  •   Oliver Charlesworth    14 年前

    不,你不能那样做。 enum s或多或少相当于 int s。

    你可以做这样的事情,比如说一个工会:

    typedef struct
    {
        int   a;
        float b;
    } type1_t;
    
    typedef struct
    {
        char  c;
        long  d;
    } type2_t;
    
    typedef union
    {
        type1_t  t1;
        type2_t  t2;
    } myUnion_t;
    
    
    ...
    
    myUnion_t u;
    u.t1.a = 3;
    u.t1.b = 2.7f;
    
        5
  •  0
  •   frast    14 年前

    那不管用。最贴切的办法就是在你的结构上使用一个空白。