Использование типов данных в объявлении enum - PullRequest
0 голосов
/ 10 ноября 2010

Могу ли я сделать что-то подобное?Я хотел бы использовать типы данных вместо констант в моем перечислении 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.

Ответы [ 5 ]

2 голосов
/ 10 ноября 2010

Нет. Обычный способ сделать что-то подобное в 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;
2 голосов
/ 10 ноября 2010

Нет, вы не можете этого сделать. Если вы использовали C ++, вы могли бы использовать шаблоны для достижения этой цели. Но в C. не существует механизма "type enum".

Вы могли бы рассмотреть союз:

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 и подумать, какого члена профсоюза использовать. Если вы используете неправильный файл, вы получите неверные данные, что может привести к сбою программы, поэтому будьте осторожны.

1 голос
/ 10 ноября 2010

Нет, вы не можете этого сделать.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;
1 голос
/ 10 ноября 2010

Я думаю, что вы ищете union

0 голосов
/ 10 ноября 2010

Это не работает.Самое близкое - использовать пустоту * в вашей структуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...