smalltalk - Squeak : Singleton ExternalLibrary vs. 类方法中的 FFI 与 ExternalStructures 中的方法?

标签 smalltalk ffi squeak

我正在为现有库(用 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/

相关文章:

smalltalk - pharo 中的 "instance Variable Names"和 "class Variable Names"有什么区别?

smalltalk - 检查类的存在

rust - 无法使用 bindgen 设置包含路径

smalltalk - 如何以编程方式在smalltalk80(squeak)中创建箭头变形?

linux - 让新的 Squeak 5 在 64 位 Linux 上运行

sleep - step动画需要在smalltalk中休眠

smalltalk - 有没有使用Squeak Smalltalk的大型商业项目?

smalltalk - 在测试中检查类的文本表示?

ruby - 如何使用 ruby​​ FFI 读取静态结构数组

c# - 在 Enum (EntryPointNotFound) 上使用 IntPtr 从 C# 调用 Rust 失败