smalltalk - 如何在 Squeak FFI 中处理 typedef

标签 smalltalk ffi squeak

我想与一个库(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/

相关文章:

reflection - Squeak 中的拦截消息

smalltalk - 如何在 Cuis/Squeak/Pharo 中强制完成(用于测试)?

smalltalk - 在 Smalltalk 中返回消息

promise - Pharo 与 Smalltalk 的差异

javascript - 为什么 EnumPrintersA 和 EnumPrintersW 请求相同数量的内存?

c++ - 如何通过 Rust FFI 调用 C++ 构造函数?

variables - 在 Squeak 中创建新的伪变量

smalltalk - 什么代表这个 pharo 类图标?

smalltalk - 使用 Amber 将选项传递给 JS 函数

ruby - Haskell 通过 FFI 与 Ruby 绑定(bind)?