我正在为现有的库编写一个FFI接口(用C语言编写).
该库使用了大量不透明结构,因此我定义了一些ExternalStructures(没有字段)用作void*.
现在我已经看到了两种与库连接的方式(或四种方式):
有一个ExternalLibrary与每个导出函数的方法:这可能会在实例类的方法,然后使用一个单例模式有一个实例.或者使用"更复杂"的语法实现类侧的方法,包括moduleNameFFI编译指示,如:
ffiTestFloats: f1 with: f2
"FFITestLibrary ffiTestFloats: $A with: 65.0"
<cdecl: float 'ffiTestFloats' (float float) module:'SqueakFFIPrims'>
^self externalCallFailed
Run Code Online (Sandbox Code Playgroud)
什么更好?
另外,我已经看到了这样做的其他方式,根本没有ExternalLibrary,并直接在实现方法ExternalStructure.我更喜欢第二部分,但是,所有FFI接口定义都通过几个类传播,维护和移植到其他平台,Smalltalk方言或库版本可能更复杂.
那么,做到这一点的"正确"方式是什么?