Smalltalk 如何在Squeak FFI中定义联合类型

Smalltalk 如何在Squeak FFI中定义联合类型,smalltalk,ffi,squeak,Smalltalk,Ffi,Squeak,我想与对某些结构字段使用某种联合类型的库进行接口,例如: typedef struct { H5L_type_t type; /* Type of link */ hbool_t corder_valid; /* Indicate if creation order is valid */ int64_t corder; /* Cr

我想与对某些结构字段使用某种联合类型的库进行接口,例如:

typedef struct {
    H5L_type_t          type;           /* Type of link                   */
    hbool_t             corder_valid;   /* Indicate if creation order is valid */
    int64_t             corder;         /* Creation order                 */
    H5T_cset_t          cset;           /* Character set of link name     */
    union {
        haddr_t         address;        /* Address hard link points to    */
        size_t          val_size;       /* Size of a soft link or UD link value */
    } u;
} H5L_info_t;
我在Squeak FFI中没有看到任何形式的支持


我应该自己确定最长的成员大小并坚持吗?

因此,在仔细检查源代码后,我可以看出Squeak FFI不支持union

这种情况不一定会持续下去,因此我发布了Squeak FFI的更新,以支持工会。


ExternalUnion
ExternalStructure
(作为子类)共享基本相同的代码,只是它使用常量
字节偏移量
max:
运算符来累积总字节大小,而不是在迭代字段时使用
+
运算符递增的
字节偏移量

非常适合
外部对象
的层次结构。我同意将
ExternalUnion
作为
ExternalStructure
的特例来阅读是有用的。C标准如何谈论工会?这些解释是否与结构有关?将ExternalStructure子类化是避免FFI插件更改的必要技巧。但如果我们愿意,我们也可以改变。