3

在迈向自举方案解释器的第一步中,我发现了以下一组 typedef、struct、union 和 enum 定义:

typedef enum {FIXNUM} object_type;

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

特别是,我不确定我是否理解 union ( struct { long value; } fixnum;) 内部结构的意义——一个只有一个字段的结构,要保存一个 long 吗?很奇怪。

但我也不确定我是否理解更大的一点。我认为枚举定义的情况是他正在为词汇实体设置许多可能的类型值,这object是一种保存这些值的方法,但也许比我有更多 C 实践经验的人可以提供更详细的解释.

谢谢!

4

2 回答 2

3

没错,struct-inside-a-union-inside-a-struct 在这段代码中是相当无用的,但是作者将它作为后面代码的垫脚石。因为他知道未来的代码会是什么样子,所以他可以准备早期的代码以使更改尽可能少。

在教程的第二部分,定义扩展为:

typedef enum {BOOLEAN, FIXNUM} object_type;

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

现在 anobject可以保存两个不同的值(布尔值或整数),因此联合现在可以发挥作用。不过,内部结构仍然是多余的。请注意处理 fixnums 的任何代码都无需更改。

我怀疑内部结构只是为了并行。在 v0.6 中,作者添加了pair类型,它由两个指针的结构组成。

于 2010-10-12T04:17:17.123 回答
2

你是对的。这将是一个单一类型,可以保存许多不同类型的值。

这是第一步。第二步是为此添加另一种类型。

为此,您将向 中添加类型 IDenum并将值本身添加到联合中,例如:

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;

这只是我的假设,随着您在迭代中的推进,他们选择这样做的原因可能会变得很清楚。

于 2010-10-12T04:16:04.927 回答