5

我想绑定到一个 C 函数abc,其签名是:

int abc(void (*)(int))

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

球拍中的正确咒语是什么?

4

1 回答 1

8

这是一个类似绑定的示例:假设我们要绑定一个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 绑定库在哪里ffi-lib。在这里,我们看到第一个参数call-twice本身就是 a (_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.

于 2013-06-08T02:25:02.457 回答