代码之家  ›  专栏  ›  技术社区  ›  Weston C

这个C typedef/struct/union/enum定义系列有什么意义?

  •  3
  • Weston C  · 技术社区  · 14 年前

    在这里面 first step 朝着 a bootstrapped scheme interpreter 我找到以下一组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 是一种保存这些信息的方法,但也许在C语言方面有比我更多实践经验的人可以提供更详细的解释。

    谢谢!

    2 回复  |  直到 12 年前
        1
  •  3
  •   Adam Rosenfield    14 年前

    你说得对,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;
    

    现在一个 object 可以保存两个不同的值(布尔值或整数),因此联合现在起作用。不过,内部结构仍然是多余的。注意处理fixnum的代码都不需要更改。

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

        2
  •  2
  •   paxdiablo    14 年前

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

    这是第一步。第二步将添加另一个类型。

    为此,您将向 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;
    

    这只是我的猜测,随着你的迭代,它可能会变得清晰起来。 为什么? 他们选择那样做。