Какой смысл в этой серии определений C typedef / struct / union / enum? - PullRequest
3 голосов
/ 12 октября 2010

Внутри этого первого шага к загрузочному интерпретатору схемы Я обнаружил следующий набор определений typedef, struct, union и enum:

typedef enum {FIXNUM} object_type;

typedef struct object {
    object_type type;
    union {
        struct {
            long value;
        } fixnum;
    } data;
} object;

В частности, я не уверен, что понимаю смысл структуры внутри объединения (struct { long value; } fixnum;) - структуры только с одним полем, чтобы хранить одну длинную строку? Очень странно.

Но я не совсем уверен, что понимаю и более важную мысль. Я думаю , что происходит с определением перечисления, так это то, что он устанавливает множество возможных значений типов для лексических сущностей, и что object это способ их удержания, но, возможно, кто-то с большим опытом в Си чем я могу предложить более подробное объяснение.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 октября 2010

Вы правы, struct-inside-a-union-inside-struct довольно бесполезна в этом коде, но автор использует ее в качестве основы для более позднего кода. Так как он знает, как будет выглядеть будущий код, он может подготовить предыдущий код, чтобы сделать изменения как можно меньше.

Во второй части урока определение расширяется до следующего:

typedef enum {BOOLEAN, FIXNUM} object_type;

typedef struct object {
    object_type type;
    union {
        struct {
            char value;
        } boolean;
        struct {
            long value;
        } fixnum;
    } data;
} object;

Теперь object может содержать два разных значения (логическое или целое), поэтому объединение теперь служит цели. Внутренние структуры все еще излишни. Обратите внимание, что ни один из кодов, работающих с fixnums, не должен меняться.

Я подозреваю, что внутренние структуры существуют только для параллелизма. В версии 0.6 автор добавляет тип pair, который состоит из структуры из двух указателей.

2 голосов
/ 12 октября 2010

Ты прав.Это будет один тип, который может содержать несколько различных типизированных значений.

Это первый шаг.Вторым шагом будет добавление еще одного типа к этому.

Для этого вы добавите идентификатор типа к enum и добавите само значение в объединение, что-то вроде:

typedef enum {FIXNUM,FLOATNUM} object_type;

typedef struct object {
    object_type type;
    union {
        struct { long  value; } fixnum;
        struct { float value; } floatnum;
    } data;
} object;

Что касается причины, по которой у вас есть однополевые структуры, я предполагаю, что они допускают возможность многополевых структур в дальнейшем:

typedef enum {FIXNUM,FLOATNUM,STRING} object_type;

typedef struct object {
    object_type type;
    union {
        struct { long  value;             } fixnum;
        struct { float value;             } floatnum;
        struct { size_t len;  char *data; } string;
    } data;
} object;

Это просто предположение на моемотчасти, это, вероятно, станет ясно по мере продвижения по итерациям , почему они решили сделать это таким образом.

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