Smalltalk 如何处理Squeak FFI中的typedefs
我想与一个库(HDF5)接口,它在函数原型和结构定义中都专门使用自己的typedefSmalltalk 如何处理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;
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' )
DoHbool\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)