我可以这样做吗?我想在枚举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_t
或type2_t
。因此,如果我将类型设置为type2_t
,则其大小应该大于我设置type1_t
时的大小。
答案 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.type1value
和midas.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 *。