我正在为现有库(用 C 编写)编写 FFI 接口(interface)。
该库使用了大量的不透明结构,因此我定义了一些 ExternalStructures
(没有字段)用作void*
.
现在我已经看到了与库交互的两种(或四种?)方式:
拥有 ExternalLibrary
每个导出函数都有一个方法:这可以在实例类中有方法,然后使用单例模式来拥有一个实例。或者使用“更复杂”的语法实现类中的方法,包括 moduleName
在 FFI 杂注中,如:
ffiTestFloats: f1 with: f2
"FFITestLibrary ffiTestFloats: $A with: 65.0"
<cdecl: float 'ffiTestFloats' (float float) module:'SqueakFFIPrims'>
^self externalCallFailed
什么更好?
此外,我还看到了其他方法,没有
ExternalLibrary
完全没有,直接在 ExternalStructure
中实现方法.我更喜欢第二部分,但是,所有 FFI 接口(interface)定义都分布在几个类中,维护和移植到其他平台、Smalltalk 方言或库版本可能会更复杂。那么,什么是“正确”的做法呢?
最佳答案
我会选择 ExternalLibrary
方法,因为它允许您自定义库名称,而不是在每个方法中对其进行硬编码。
关于smalltalk - Squeak : Singleton ExternalLibrary vs. 类方法中的 FFI 与 ExternalStructures 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41214583/