我想与一个库(HDF5)进行交互,该库在函数原型(prototype)和结构定义中只使用自己的类型定义。
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 中,我可以像这样处理这样的 typedef:
H5Interface>>hbool_t
<C: typedef unsigned int hbool_t>
然后我可以在原型(prototype)和结构中使用 hbool_t
,对于枚举也是如此。
但是 Squeak FFI 似乎只理解几种原子类型,并将其他任何东西解释为结构。显然,必须有人进行翻译,如果它不是自动化的,那么它既容易出错,又对外部库的 future 发展不稳健。
那么避免这种脆弱性的推荐方法是什么?
最佳答案
似乎有一个模糊的功能来处理别名(typedef)
创建一个新的ExternalStructure类
ExternalStructure subclass: #'Hbool_t'
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'FFI-Tests'
然后使用 nil 和别名类型创建 fields 方法
Hbool_t class>>fields
^#( nil 'ulong' )
执行Hbool_t DefineFields
,现在“Hbool_t”是一个注册类型,可以在其他结构定义和函数原型(prototype)中使用。
它不完全是'hbool_t',但它比直接用ulong替换要好。
关于smalltalk - 如何在 Squeak FFI 中处理 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49783882/