作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想绑定(bind)一个 C 函数 abc
其签名是:
int abc(void (*)(int))
int
并且有
void
返回类型。
最佳答案
这是一个类似绑定(bind)的示例:假设我们要绑定(bind)一个函数 callTwice
签名:
int callTwice(int (*)(int));
int callTwice(int (*f)(int)) {
return f(f(42));
}
(define call-twice (get-ffi-obj "callTwice" the-lib
(_fun (_fun _int -> _int) -> _int)))
the-lib
是我们从
ffi-lib
获得的 FFI 绑定(bind)库.在这里,我们看到
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)
为您的回调类型的值。
pre-installer.rkt
在该目录中构建扩展,然后通过运行
test-call-twice.rkt
对其进行测试.
关于 Racket FFI : C function which accepts a pointer to a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16994644/
我是一名优秀的程序员,十分优秀!