我想绑定到签名为:
的C函数abc
int abc(void (*)(int))
即。它接受一个指向函数的指针。此回调接受int
并具有void
返回类型。
Racket中的正确咒语是什么?
答案 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
对其进行测试。