我想绑定到一个 C 函数abc
,其签名是:
int abc(void (*)(int))
即它接受一个指向函数的指针。这个回调接受一个int
并且有void
返回类型。
球拍中的正确咒语是什么?
这是一个类似绑定的示例:假设我们要绑定一个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
.