Smalltalk 如何处理Squeak FFI中的typedefs

Smalltalk 如何处理Squeak FFI中的typedefs,smalltalk,ffi,squeak,Smalltalk,Ffi,Squeak,我想与一个库(HDF5)接口,它在函数原型和结构定义中都专门使用自己的typedef typedef struct { H5L_type_t type; /* Type of link */ hbool_t corder_valid; /* Indicate if creation order is valid */ int64_t corder;

我想与一个库(HDF5)接口,它在函数原型和结构定义中都专门使用自己的typedef

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;
在使用DLLCC的Visualworks中,我可以处理这样的类型定义:

H5Interface>>hbool_t
    <C: typedef unsigned int hbool_t>
h5接口>>hbool\t
然后我可以在原型和结构中使用
hbool\t
,对于enum也是如此

但Squeak FFI似乎只理解一些原子类型,并将其他任何东西解释为一种结构。显然,必须有人来做翻译,如果翻译不是自动化的,那么它很容易出错,而且对外部库的未来发展也不可靠


那么,避免这种脆弱性的推荐方法是什么呢?

似乎有一个模糊的别名处理功能(typedef)

创建一个新的ExternalStructure类

ExternalStructure subclass: #'Hbool_t'
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'FFI-Tests'
然后创建具有nil和别名类型的字段方法

Hbool_t class>>fields
    ^#( nil 'ulong' )
Do
Hbool\u t defineFields
现在“Hbool\u t”是一个注册类型,可以用于其他结构定义和函数原型中


它不完全是“hbool\u t”,但它比ulong直接替换要好。

自mt.92以来,您还可以将
外部类型别名子类化,以清晰的方式记录类型别名。看

示例alias可以使用新的基类:

ExternalTypeAlias subclass: #'Hbool_t'
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'FFI-Tests'
类端只需要原始类型名,即您正在使用别名的类型名:

Hbool_t class>>originalTypeName
    ^ 'ulong'
请注意,
Hbool\u t defineFields
还将定义访问器
#value
#value:
,以在运行时解析别名

还请注意,具有使用该别名的字段的外部结构将创建实例,即使是原子类型的别名:

H5L_info_t>>corder_valid
    <generated>
    ^ Hbool_t fromHandle: (handle unsignedLongAt: 123456)
H5L\u信息>>录像机有效
^Hbool\u t fromHandle:(句柄未签名长度:123456)