Racket FFI:C函数,接受指向函数的指针

时间:2013-06-08 00:07:21

标签: racket ffi

我想绑定到签名为:

的C函数abc
int abc(void (*)(int))

即。它接受一个指向函数的指针。此回调接受int并具有void返回类型。

Racket中的正确咒语是什么?

1 个答案:

答案 0 :(得分:7)

以下是类似绑定的示例:假设我们要将函数callTwice与签名绑定:

int callTwice(int (*)(int));

以及愚蠢的C实现:

int callTwice(int (*f)(int)) {
  return f(f(42));
}

这是Racket FFI绑定的样子:

(define call-twice (get-ffi-obj "callTwice" the-lib
                                (_fun (_fun _int -> _int) -> _int)))

其中the-lib是我们从ffi-lib获得的FFI绑定库。在这里,我们看到call-twice的第一个参数本身就是(_fun _int -> _int),这是我的示例所需的函数指针类型。

这意味着从技术上讲,我们可以写下这个:

(define _mycallback (_fun _int -> _int))

(define call-twice (get-ffi-obj "callTwice" the-lib
                                (_fun _mycallback -> _int)))

更容易看到call-twice将回调作为唯一的参数。对于您的情况,您可能希望(_fun _int -> _void)获得回调类型的值。

完整计算的例子可以在这里找到:https://github.com/dyoo/ffi-tutorial/tree/master/ffi/tutorial/examples/call-twice。运行该目录中的pre-installer.rkt以构建扩展,然后通过运行test-call-twice.rkt对其进行测试。