【发布时间】:2016-12-19 01:12:24
【问题描述】:
我正在为现有库(用 C 编写)编写 FFI 接口。
该库使用了大量的不透明结构,因此我定义了几个ExternalStructures(没有字段)用作void*。
现在我已经看到了与库交互的两种(或四种?)方式:
拥有一个ExternalLibrary,每个导出函数都有一个方法:这可以在实例类中有方法,然后使用单例模式来拥有一个实例。或者使用“更复杂”的语法在类端实现方法,包括 FFI 杂注中的 moduleName,如下所示:
ffiTestFloats: f1 with: f2
"FFITestLibrary ffiTestFloats: $A with: 65.0"
<cdecl: float 'ffiTestFloats' (float float) module:'SqueakFFIPrims'>
^self externalCallFailed
什么更好?
此外,我还看到了其他方法,根本没有ExternalLibrary,而是直接在ExternalStructure 中实现这些方法。我更喜欢第二部分,但是,所有 FFI 接口定义都分布在几个类中,维护和移植到其他平台、Smalltalk 方言或库版本可能会更复杂。
那么,“正确”的做法是什么?
【问题讨论】:
-
我不知道这是什么 Squeak 方式,但我喜欢 ExternalLibrary 的方法,每个导出函数一个方法。在 ExternalStructure 中也有方法可能会很棘手,因为某些函数可能有多个结构或根本没有结构。