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

时间:2010-11-10 20:47:19

标签: c data-structures

我可以这样做吗?我想在枚举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变量应该引用type1_ttype2_t。因此,如果我将类型设置为type2_t,则其大小应该大于我设置type1_t时的大小。

5 个答案:

答案 0 :(得分:2)

不,你不能这样做。如果您使用的是C ++,则可以使用模板来实现此目的。但是C中没有“类型枚举”机制。

你可以考虑一个联盟:

typedef enum {
    type1, type2
} type_t;

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

这将导致midas.type1valuemidas.type2value占用相同的内存空间。为union提供的内存量将等于存储它包含的最大数据类型所需的内存量。

然后,您必须查看midas.typecode并考虑使用哪个工会成员。如果您使用了错误的数据,您将收到无效数据,这可能会导致程序崩溃,所以要小心。

答案 1 :(得分:2)

没有。在C中执行此类操作的常用方法是使用union:

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;

答案 2 :(得分:1)

我认为您正在寻找union

答案 3 :(得分:1)

不,你不能这样做。 enum或多或少等同于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;

答案 4 :(得分:0)

这不起作用。最接近的是对你的结构使用void *。